我使用的列表框与DataTemplate
如下所示(xaml简化和变量名称已更改)。MVVM Listbox DataTemplate SelectedItem
<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="{Binding DataContext.CommandName} RelativeSource={RelativeSource FindAncestor, ListBox, 1}
。我不完全明白它在做什么,但我知道当我直接绑定到CommandName
时,命令没有被触发。
一定要把你的SelectedItem绑定放在你的ItemsSource绑定之前。否则,当ItemsSource解除绑定时,SelectedItem将得到null的setter调用。 –
我将确保绑定以该顺序进行设置。感谢指针。 – StinkerPeter