我使用的列表框與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