【问题标题】:MVVM ListBox controlling a Content ControlMVVM ListBox 控制内容控件
【发布时间】:2009-12-14 22:37:25
【问题描述】:

这几天我一直在绕圈子,我希望 WPF 专家能看到我哪里出错了。

我正在代码中设置 CurrentViewModel。我的 ListBox 的 Selected 项和我的 ContentControl 的内容正确绑定。但是,当通过 UI 更改列表框中的选定项目时,正在设置 CurrentViewModel,但没有更新内容控件。

我正在使用数据模板来映射我的视图和视图模型。

    <DataTemplate DataType="{x:Type ViewModel:MyViewModel}">
       <View:MyView />
    </DataTemplate>

我有一个绑定到 ViewModel 的可观察集合的 ListBox。选定项绑定到当前视图模型。

 <ListBox ItemsSource="{Binding MyViewModelCollection}" DisplayMemberPath="DisplayName" SelectedItem="{Binding CurrentViewModel, Mode=TwoWay}"/>

我还有一个也绑定到 CurrentView 模型的内容控件

 <ContentControl Content="{Binding CurrentViewModel, Mode=TwoWay}"/>

这是它们都绑定到的属性

        public MyViewModel CurrentViewModel
    {
        get
        {
            return _currentViewModel;
        }
        set
        {
            if (_currentViewModel== value) return;

            _currentViewModel= value;
            OnPropertyChanged("CurrentViewModel");
        }
    }

为了清晰起见,我编辑了名称并删除了格式信息。

非常感谢任何帮助。

干杯,

丹尼尔

编辑:看到链接How can I debug WPF bindings?。我在内容绑定上设置了一个断点,它确实只在第一次设置绑定时被调用一次。

【问题讨论】:

    标签: wpf mvvm binding listbox


    【解决方案1】:

    您不应该将 TwoWay 设置为 ContentControl 上的模式:

    <ContentControl Content="{Binding CurrentViewModel, Mode=OneWay}"/>
    

    这是因为您希望您的 ContentControl 读取该值,但从不写入它。


    顺便说一句,您还可以通过以下方式将 ContentControl 绑定到集合中当前选定的项目,而不是绑定到该属性:

    <ListBox ItemsSource="{Binding MyViewModelCollection}" 
             DisplayMemberPath="DisplayName" 
             IsSynchronizedWithCurrentItem="True"/>
    
    <ContentControl Content="{Binding MyViewModelCollection/}"/>
    

    集合末尾的“斜线”(/)表示集合中选择的当前项,设置当前项属性就像将 IsSynchronizedWithCurrentItem 设置为 true 一样简单。

    我发现很多时候使用这种组合,我真的不需要我的视图模型上的额外属性。

    无论如何,我希望这会有所帮助。

    【讨论】:

    • 感谢您的建议,我将内容的绑定设置回一种方式。这就是它最初的样子,我想我将它设置为两种方式只是为了测试它是否有任何效果。我尝试了另一种绑定方法,但仍然存在相同的行为。初始绑定设置正常,但更改列表框不会更新内容。
    • 我制作了一个与您的帖子一模一样的示例,并且似乎可以正常工作。您确定您的财产上的二传手正在解雇吗?我想你可能有其他事情发生。试着用一个简单的字符串集合做同样的事情。回到基础并检查您的假设。使用字符串集合将消除数据模板的问题。可能是您的数据模板不太正确。
    • 感谢您的帮助。我对样本做了同样的事情并让它工作。回到我的主应用程序,问题与区域的激活方式有关。仍然不确定为什么它会工作一次。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 2011-11-15
    相关资源
    最近更新 更多