wpf 绑定在< ItemsControl.ItemTemplate>

r6vfmomb  于 2023-05-19  发布在  其他
关注(0)|答案(2)|浏览(174)

我无法在MVVM设计模式中获取DataTemplate的文本属性绑定。
为了说明下面的问题,我对我的问题进行了简化,将两个不同的视图属性绑定到同一个模型属性(也称为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后面的代码(它为Button<ItemsControl ItemsSource>中的每个项目设置了相同的DataContext):

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里面的绑定不起作用?

lxkprmvk

lxkprmvk1#

这里有各种各样的事情要理解:

  1. Button控件将DataContext设置为MainWindowViewModel示例。这就是ButtonText变量值在Button控件文本中得到反映的原因。
    1.对于ItemsControl,DataContext与Button相同,即MainWindowViewModel示例。
  2. ItemsControl ItemsSource中的每个项都充当ItemTemplate中元素的DataContext,即DockPanel及其子元素。这由框架自动管理。所以本质上你需要在类中有一个名为ItemText的公共属性,它将作为Dockpanel的DataContext。
    在您的情况下,ItemText属性不是列表中对象的一部分。
2skhul33

2skhul332#

您可能需要添加DataContext,并设置RelativeSource。
如果ItemText仅是集合中一个项的文本,则此操作应该有效。

{Binding ItemText}

如果ItemText是DataContext的某个属性,则需要像这样添加DataContext...

{Binding DataContext.ItemText, RelativeSource={RelativeSource AncestorType=ItemsControl}}

相关问题