Связывание не работает внутри - PullRequest
0 голосов
/ 09 января 2020

Я не могу получить привязку текстового свойства для DataTemplate в шаблоне проектирования MVVM.
Чтобы показать проблему, ниже приведено упрощение моей проблемы, в котором я связываю два разных свойства вида с одной моделью. свойство (aka AnObject.Text).

Мой код в MainWindow.xaml:

...
<Button Grid.Row="0" Content="{Binding ButtonText}" />
...
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto">
   <ItemsControl ItemsSource="{Binding MyItems}">
      <ItemsControl.ItemTemplate>
         <DataTemplate>
            <DockPanel>
               <Label Content="aaaaa" />
               <TextBlock Text="{Binding ItemText}" />
            </DockPanel>
         </DataTemplate>
      </ItemsControl.ItemTemplate>
   </ItemsControl>
</ScrollViewer>
...

Мой код в MainWindow.xaml.cs (который устанавливает DataContext для Button и каждый элемент в <ItemsControl ItemsSource>):

public MainWindow()
{
   InitializeComponent();
   DataContext = new MainWindowViewModel();
}

Мой код в MainWindowViewModel.cs:

...
public ObservableCollection<object> MyItems => MyConverter.GetCollection(MyData.List);
public string ItemText => "dddd"; //  this DOES works
public string ItemText => AnObject.Text; // this does NOT work
...
public string ButtonText => AnObject.Text; // this DOES works (note, same object property!)
...

Есть идеи, почему мое связывание внутри DataTemplate не работает?
Заранее спасибо!

1 Ответ

1 голос
/ 09 января 2020

Здесь есть несколько вещей, которые нужно понять:

  1. Для элемента управления Button будет установлен DataContext, равный экземпляру MainWindowViewModel. По этой причине значение переменной ButtonText отражается в тексте элемента управления Button.

  2. Для ItemsControl DataContext такой же, как и для Button, т. Е. Экземпляр MainWindowViewModel.

  3. Каждый элемент в ItemsControl ItemsSource действует как DataContext для элементов ItemTemplate, то есть DockPanel и его дочерних элементов. Это автоматически управляется платформой. По сути, вам понадобится свойство publi c с именем ItemText в классе, которое будет действовать как DataContext для Dockpanel.

В вашем случае свойство ItemText не является частью объекты, находящиеся в списке.

...