Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Binding на уровень выше {Binding ../Item} - как? / 13 сообщений из 13, страница 1 из 1
22.07.2016, 13:24
    #39278617
13th
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding на уровень выше {Binding ../Item} - как?
Есть ViewModel:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
	class TestViewModel2
	{
		public string[] ItemsForCombo { get; set; }

		public ObservableCollection<SomeItem> ItemsForList { get; set; }
	}

	class SomeItem
	{
		public string Name { get; set; }
		public int Volume { get; set; }
		public int SelectedIndex { get; set; }
	}



Есть форма, на ней вверху сомбик, а потом ListBox, в котором каждый итем отображает структуру SomeItem. Так же в каждой строке должен быть комбик, заполненный теми же строками, что и комбик на форме:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
		<ListBox ItemsSource="{Binding ItemsForList}">
			<ListBox.ItemTemplate>
				<HierarchicalDataTemplate DataType="controls:SeriaAttr">
					<StackPanel>
						<Label Content="{Binding Name}" />
						<Label Content="{Binding Volume}" />
						<ComboBox ItemsSource="{Binding ???}" SelectedIndex="{Binding SelectedIndex}" />
					</StackPanel>
				</HierarchicalDataTemplate>
			</ListBox.ItemTemplate>
		</ListBox>


Как сделать для комбиков в листе биндинг, что бы не копировать ItemsForCombo в каждый SomeItem?
...
Рейтинг: 0 / 0
22.07.2016, 13:27
    #39278622
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding на уровень выше {Binding ../Item} - как?
Например на уровне ListBox-а объявить присоединяемое свойство и привязать его к выбранному элементу в комбике, а элементы привязать к этому же присоединяемому свойству через FindAncestor
...
Рейтинг: 0 / 0
22.07.2016, 15:27
    #39278757
13th
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding на уровень выше {Binding ../Item} - как?
Не понял...
...
Рейтинг: 0 / 0
22.07.2016, 16:22
    #39278822
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding на уровень выше {Binding ../Item} - как?
Код: xml
1.
2.
3.
4.
5.
		<ListBox ItemsSource="{Binding ItemsForList}" local:MyClass.MyProperty="{Binding куданадо}">
...
						<ComboBox ItemsSource="{Binding Path=(local:MyClass.MyProperty), RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox}}" 
...
		</ListBox>

Как-то так (сорри, если где-нить опечатка в синтаксисе, писал по памяти)

"куданадо" - это как раз привязка к источнику (выше сказал "к текущему элементу" - невнимательно прочитал вопрос)
...
Рейтинг: 0 / 0
22.07.2016, 17:26
    #39278904
13th
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding на уровень выше {Binding ../Item} - как?
Всё понятно, спасибо
...
Рейтинг: 0 / 0
22.07.2016, 22:53
    #39279054
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding на уровень выше {Binding ../Item} - как?
Shocker.Pro,

есть способ проще, у ItemsControl есть виртуальный метод PrepareContainerForItemOverride и GenerateItemContrainer, как раз в первом и просходит определение таких свойств как ContentTemplate\Selector, задается стиль, особенно актуально для TreeView, где стиль надо передавать на каждый уровень иерархии, хотя я редко его использую и строю деревья в ListBox.
Короче можно просто наследовать класс, не переопределяя свойство DefaultStyleKey и этот контрол будет использовать стили обычного ListBox'а, но с доп. функционалом )
...
Рейтинг: 0 / 0
25.07.2016, 17:46
    #39279841
13th
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding на уровень выше {Binding ../Item} - как?
Shocker.Pro , я не свойство присоединил, я просто сделал поиск не по ListBox-у, а по Window:

Код: xml
1.
2.
3.
4.
5.
6.
7.
		<ListBox HorizontalContentAlignment="Stretch" ItemsSource="{Binding ItemsForList}">
			<ListBox.ItemTemplate>
				<DataTemplate>
					<ComboBox ItemsSource="{Binding Path=ItemsForCombo, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" SelectedIndex="{Binding SelectedIndex}" />
				</DataTemplate>
			</ListBox.ItemTemplate>
		</ListBox>



ну и в окошке добавил:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
	public partial class Window3 : Window
	{
		public Window3()
		{
			InitializeComponent();
		}

		public string[] ItemsForCombo
		{
			get
			{
				return (this.DataContext as TestViewModel3).ItemsForCombo;
			}
		}
	}
...
Рейтинг: 0 / 0
25.07.2016, 17:47
    #39279842
13th
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding на уровень выше {Binding ../Item} - как?
Roman Mejtes, это что-то совсем не понятное. У меня даже сложилось впечатление, что это, возможно, должно быть в каком-то другом треде (-:
...
Рейтинг: 0 / 0
25.07.2016, 17:55
    #39279846
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding на уровень выше {Binding ../Item} - как?
13thя не свойство присоединил, я просто сделал поиск не по ListBox-у, а по Window:Ну тут уже получается немножко не MVVM.
...
Рейтинг: 0 / 0
13.08.2016, 17:37
    #39291483
Cossacker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding на уровень выше {Binding ../Item} - как?
Shocker.Pro,

<ComboBox ItemsSource="{Binding Path=DataContext.ItemsForCombo, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox}}"
...
Рейтинг: 0 / 0
14.08.2016, 12:13
    #39291562
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding на уровень выше {Binding ../Item} - как?
а кто сказал, что DataContext задан для ListBox-а?
...
Рейтинг: 0 / 0
16.08.2016, 16:53
    #39292746
13th
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding на уровень выше {Binding ../Item} - как?
Ну там же написано: ItemsSource="{Binding ItemsForList}", значит, есть контекст.
...
Рейтинг: 0 / 0
17.08.2016, 08:48
    #39292985
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Binding на уровень выше {Binding ../Item} - как?
контекст есть, но он задан выше.
А свойство ListBox.DataContext, к которому обращается Cossacker, не задано, равно null
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Binding на уровень выше {Binding ../Item} - как? / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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