我已经为此兜圈子好几天了,我希望 WPF 专家能够看到我哪里出了问题。
我正在代码中设置 CurrentViewModel。我的列表框的选定项目和我的内容控件的内容正确绑定(bind)。但是,当通过 UI 更改列表框中的所选项目时,会设置 CurrentViewModel,但不会更新内容控件。
我正在使用数据模板来映射我的 View 和 View 模型。
<DataTemplate DataType="{x:Type ViewModel:MyViewModel}">
<View:MyView />
</DataTemplate>
我有一个 ListBox,它绑定(bind)到一个可观察的 ViewModel 集合。所选项目绑定(bind)到当前 View 模型。
<ListBox ItemsSource="{Binding MyViewModelCollection}" DisplayMemberPath="DisplayName" SelectedItem="{Binding CurrentViewModel, Mode=TwoWay}"/>
我还有一个也绑定(bind)到 CurrentView Model 的内容控件
<ContentControl Content="{Binding CurrentViewModel, Mode=TwoWay}"/>
这是它们都绑定(bind)到的属性
public MyViewModel CurrentViewModel
{
get
{
return _currentViewModel;
}
set
{
if (_currentViewModel== value) return;
_currentViewModel= value;
OnPropertyChanged("CurrentViewModel");
}
}
为了清晰起见,我编辑了名称并删除了格式信息。
非常感谢任何帮助。
干杯,
丹尼尔
编辑:发现了链接How can I debug WPF bindings? 。我在内容绑定(bind)上设置了一个断点,它确实只在首次设置绑定(bind)时被调用一次。
最佳答案
您不应将 TwoWay 设置为 ContentControl 上的模式:
<ContentControl Content="{Binding CurrentViewModel, Mode=OneWay}"/>
这是因为您希望 ContentControl读取该值,但绝不写入它。
<小时/>顺便说一句,您还可以将 ContentControl 绑定(bind)到集合中当前选定的项目,而不是通过执行以下操作绑定(bind)到该属性:
<ListBox ItemsSource="{Binding MyViewModelCollection}"
DisplayMemberPath="DisplayName"
IsSynchronizedWithCurrentItem="True"/>
<ContentControl Content="{Binding MyViewModelCollection/}"/>
集合末尾的“斜杠”(/) 表示在集合中选择的当前项目,设置当前项目属性就像将 IsSynchronizedWithCurrentItem 设置为 true 一样简单。
很多时候,我发现使用这种组合,我真的不需要 View 模型上的额外属性。
无论如何,我希望这会有所帮助。
关于wpf - MVVM ListBox 控制内容控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1904009/