wpf - MVVM ListBox 控制内容控件

标签 wpf mvvm binding listbox

我已经为此兜圈子好几天了,我希望 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/

相关文章:

wpf - 有没有办法对属性的属性使用样式 setter ?

c# - WPF在按钮上播放 “Click”动画。模拟代码点击

c# - 将 CustomControl DependencyProperty 绑定(bind)到 ViewModel 枚举

json - 未使用 json 数据完成绑定(bind)

将多个结果转换为逗号分隔字符串的 WPF XPath 绑定(bind)

c# - MVVM 按钮内容属性不起作用

wpf - 当集合更改时保留绑定(bind)的 WPF ListBox 的滚动位置

wpf - MVVM概念的混淆

c# - 以编程方式将 ObservableCollection 绑定(bind)到 ListBox

java - MyBatis - 在 foreach 中绑定(bind)参数