【发布时间】:2011-11-25 01:43:43
【问题描述】:
我正在使用带有DataTemplate 的 ListBox,如下所示(xaml 简化并且变量名称已更改)。
<ListBox ItemsSource="{Binding Path=ObservCollectionItems}"
SelectedItem="{Binding Path=SelectedItemVar, Mode=TwoWay}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding SomeVar}" />
<Border>
<StackPanel>
<Button Content="String1"
Command="{Binding DataContext.Command1}
RelativeSource={RelativeSource FindAncestor, ListBox, 1}}" />
<Button Content="String2"
Command="{Binding DataContext.Command2}
RelativeSource={RelativeSource FindAncestor, ListBox, 1}}" />
</StackPanel>
</Border>
</StackPanel>
</DataTemplate>
<ListBox.ItemTemplate>
</ListBox>
当我单击其中一个按钮时,我需要更新 SelectedItemVar(依赖属性)。然后将 SelectedItemVar 用于相应按钮的命令。当我单击TextBlock 或Border 时,SelectedItemVar 会更新,但当我单击任一按钮时不会更新。我找到了这个问题的非 MVVM 解决方案here。我不想在文件后面添加代码来解决这个问题,就像他们在链接中所做的那样。
是否有可以在 XAML 中完成的干净解决方案。除了非 MVVM 解决方案之外,我还没有发现有人遇到这个问题。我会认为这是相当普遍的。
最后,我为 Command 绑定找到了这个 Command="{Binding DataContext.CommandName} RelativeSource={RelativeSource FindAncestor, ListBox, 1}。我不完全理解它在做什么,但我知道当我直接绑定到 CommandName 时该命令没有触发。
【问题讨论】:
-
确保将 SelectedItem 绑定放在 ItemsSource 绑定之前。否则,当 ItemsSource 取消绑定时,SelectedItem 将获得 null 的 setter 调用。
-
我将确保按该顺序设置绑定。谢谢指点。