powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Создание ссылки на ресурс из кода
10 сообщений из 10, страница 1 из 1
Создание ссылки на ресурс из кода
    #37344574
СДмитрийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имем: некоторое окно с DataGrid или ListView (не особо важно). При двойном щелчке на одной из строк, вызывается редактор содержимого этой строки, т.е. открывается диалог для правки данных(на это есть причины). При этом, в основном окне, имеем ObjectDataProvider src из которого поступают данные в DataGrid(ListView).
Требуется: Передать src в конструктор редактора содержимого, ибо src настроен определенным образом и делать его клоны или копии - не желательно.

XAML основного окна (укорочено)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<Window.Resources>
		<ObjectDataProvider x:Key="resMatDataProvider" ObjectType="{x:Type l:MaterialDataProvider}"/>
		<ObjectDataProvider x:Key="resMaterialData" ObjectInstance="{StaticResource resMatDataProvider}" MethodName="GetMaterials"/>
</Window.Resources>
<wpf:DataGrid  Name="table" CanUserAddRows="False"
				CanUserDeleteRows="False"
				CanUserReorderColumns="False"
				CanUserResizeRows="False"
				AutoGenerateColumns="False"
				IsReadOnly="True"
				MouseDoubleClick="table_OnEdit"
				ItemsSource="{Binding Source={StaticResource resMaterialData}}"/>
Обработчик события основного окна
Код: plaintext
1.
2.
3.
4.
5.
6.
private void table_OnEdit(object sender, MouseButtonEventArgs e)
{
			MaterialEdit ed = new MaterialEdit(provider);
			ed.DataContext = table.SelectedItem;
			ed.Owner = this;
			ed.ShowDialog();
}

XAML редактора
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<Window.Resources>
			<!-- Это делать нельзя -->
			<!-- ObjectDataProvider x:Key="resDataProvider" ObjectType="{x:Type lx:MaterialDataProvider}"/-->
			<! -- Это нужно, ибо в resDataProvider имеется починенные данные -->
			<ObjectDataProvider x:Key="resMatWidthData" ObjectInstance="{StaticResource resDataProvider}" MethodName="GetMatWidths" />
</Window.Resources>
<!-- Далее, поэлементный биндинг с выборкой подчиненных данных -->

Этот код не работает!!
Код: plaintext
1.
2.
3.
4.
5.
6.
public MaterialEdit(MaterialDataProvider provider)
{
	this.provider = provider;
	Resources.Add("resDataProvider", provider);
	// в следующая функция, зачемто, вызывает Resources.Clear()
	InitializeComponent();
}
...
Рейтинг: 0 / 0
Создание ссылки на ресурс из кода
    #37344763
СДмитрийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверное, я чтото невнятно написал.
Или никто не бадался с такой проблемой?
Либо, не понятно, зачем это нужно?
...
Рейтинг: 0 / 0
Создание ссылки на ресурс из кода
    #37344803
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше найти способ передать через DataContext + Binding. Возможно заменить методы GetMaterials и GetMatWidths свойствами.
...
Рейтинг: 0 / 0
Создание ссылки на ресурс из кода
    #37344826
СДмитрийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей КЛучше найти способ передать через DataContext + Binding. Возможно заменить методы GetMaterials и GetMatWidths свойствами.

Не выйдет. Ибо Binding данных редактора происходит в InitializeComponent(), т.е. до установки свойства DataContent Т.к данные для компонентов редактора брать не откуда, происходит полный "Exception" еще при конструировании объекта редактора.
...
Рейтинг: 0 / 0
Создание ссылки на ресурс из кода
    #37344830
СДмитрийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СДмитрийВ,

... к тому-же DataContent занят данными редактируемой строки.
...
Рейтинг: 0 / 0
Создание ссылки на ресурс из кода
    #37345919
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СДмитрийВНе выйдет. Ибо Binding данных редактора происходит в InitializeComponent(), т.е. до установки свойства DataContentНу и что? Изменился DataContext - обновились данные в контролах.

СДмитрийВТ.к данные для компонентов редактора брать не откуда, происходит полный "Exception" еще при конструировании объекта редактора.Тут надо что-то менять.

СДмитрийВСДмитрийВ,

... к тому-же DataContent занят данными редактируемой строки.Ну во первых, можно установить DataContext для каждого контрола индивидуально. Во вторых, DataContext корневого элемента можно присвоить объект, содержащий все необходимые данные. Второй вариант мне нравится больше.
...
Рейтинг: 0 / 0
Создание ссылки на ресурс из кода
    #37346993
СДмитрийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

resMatDataProvider используется в привязке (Binding), где нужны, по большому счету не объекты source и target а их, так скажем, интерфейсы связывания. В одном случае это DependencyProperty - статические члены определенного класса. В другом - используется Reflection определенного класса. Т.к. XAML не может определить объект какого типа(класса) ему подсунут и подсунут ли вообще в ближайшее время, получается привязка null=>target = Exception, что вполне логично. До того как привязать данные, загрузчик XAML проверяет наличие источника "интерфейса связывания" и уведомляет об отсутствии оного возбуждением исключения (если скомпилируется).

Вот такая хитрожопость была мной проверена:
Код: plaintext
1.
2.
3.
<Window.Resources>
			<ObjectDataProvider x:Key="resDataProvider" ObjectInstance="{StaticResource resMatDataProvider}"/-->
			<ObjectDataProvider x:Key="resMatWidthData" ObjectInstance="{StaticResource resDataProvider}" MethodName="GetMatWidths" />
</Window.Resources>
Это компилируется но не работает. Полный Exception при инициализации XAML. Как и следовало ожидать - "Не найден ресурс с именем "resMatDataProvider"".

Тривиальный пример:
Код: plaintext
1.
2.
3.
4.
5.
<Window.Resource>
  <l:MyDataClass x:Key="MyData">
<!-- здесь создается новый экземпляр MyDataClass и помещается в словарь ресурсов окна  и ключ оного в данном случае MyData -->
</Window.Resource>
<!-- где-то в разметке -->
  <TextBlock Text="{Binding Source={StaticResource MyData}, Path=SomeProperty}" ... />

Попробуй теперь удалить <l:MyDataClass ...>
... верно. JIT компилятор выдаст ошибку. Не скомпилируется. Не соберется. Приложения не будет.
Что будеш делать если: экземпляр класса MyDataClass уже существует в коде и должен быть источником данных для двух или более окон но не должен быть статическим?
Если интересно: в одном окне оный является основным в другом подчиненным.

Я-бы мог создать класс-обертку, заключающий в себе экземпляры MaterialDataProvider и DataRowView и передать его редактору в DataContext.
Но это опять таки не прокатит.

Вопрос в том, что-бы в ресурс XAML запихнуть экземпляр объекта из кода.
Или, поставим вопрос по другому: Требуется чтобы XAML использовал объекты определяемые в коде.
Но при загрузке и инициализации XAML словарь ресурсов окна сбрасывается, что в моем случае совершенно не уместно.
Может есть другой путь?
...
Рейтинг: 0 / 0
Создание ссылки на ресурс из кода
    #37348011
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СДмитрийВЯ-бы мог создать класс-обертку, заключающий в себе экземпляры MaterialDataProvider и DataRowView и передать его редактору в DataContext.
Но это опять таки не прокатит.Мне кажется прокатит. Главное передавать не MaterialDataProvider, а объект, содержащий свойство с необходимыми данными. Впрочем - дело Ваше. :-)
...
Рейтинг: 0 / 0
Создание ссылки на ресурс из кода
    #37348204
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Resources. MergedDictionaries
...
Рейтинг: 0 / 0
Создание ссылки на ресурс из кода
    #37348932
СДмитрийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

Попробуйте обойтись Property, DependecyProperty, DataContext и т.д

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
<Window.Resource>
<!-- то, что раньше было написано -->
	<ObjectDataProvider x:Key="resMatNameFilter" ObjectInstance="{StaticResource resMatDataProvider}" MethodName="MatNameFilter">
		<ObjectDataProvider.MethodParameters>
			<ObjectDataProvider.MethodParameters>
				<x:NullExtension/>
			</ObjectDataProvider.MethodParameters>
		</ObjectDataProvider.MethodParameters>
	</ObjectDataProvider>
</Window.Resource>
<!-- ... ну и привязка -->
	<Grid Grid.Row="0">
		<StackPanel Orientation="Horizontal" Margin="0,0,6,0" HorizontalAlignment="Left">
			<TextBlock Text="Фильтр по наименованиям" Margin="6"/>
			<TextBox Name="txtFilter" Margin="6" Width="50"
					Text="{Binding Source={StaticResource resMatNameFilter},
							Path=MethodParameters[0],
							BindsDirectlyToSource=True,
							UpdateSourceTrigger=PropertyChanged}"/>
		</StackPanel>
	</Grid>
	<wpf:DataGrid  Name="table" Margin="6" Grid.Row="1"
				   CanUserAddRows="False"
				   CanUserDeleteRows="False"
				   CanUserReorderColumns="False"
				   CanUserResizeRows="False"
				   AutoGenerateColumns="False"
				   IsReadOnly="True"
				   MouseDoubleClick="table_OnEdit"
				   ItemsSource="{Binding Source={StaticResource resMaterialData}}">
		<wpf:DataGrid.Columns>
			<wpf:DataGridTextColumn Header="Наименование" Width="150" Binding="{Binding Path=name}"/>
			<wpf:DataGridTextColumn Header="Толщина" Width="100" Binding="{Binding Path=mat_width_id,
										Converter={StaticResource MatWidthConverter},
										ConverterParameter={StaticResource resMatDataProvider}}"/>
	</wpf:DataGrid>

Это бесплатно. Пользуйтесь.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Создание ссылки на ресурс из кода
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]