双向绑定到 WPF 中多个列表框上的 ListBox SelectedItem

Posted

技术标签:

【中文标题】双向绑定到 WPF 中多个列表框上的 ListBox SelectedItem【英文标题】:TwoWay Binding to ListBox SelectedItem on more than one list box in WPF 【发布时间】:2011-01-27 22:20:18 【问题描述】:

我有一个场景,我有一个全局可用的属性窗口(类似于 Visual Studio 中的属性窗口),它绑定到我模型的 SelectedObject 属性。我有许多不同的方式来浏览和选择对象,所以我的第一次尝试是直接将它们绑定到 SelectedObject。例如:

<ListBox ItemsSource="Binding ActiveProject.Controllers" 
SelectedItem="Binding SelectedObject, Mode=TwoWay"/>

<ListBox ItemsSource="Binding ActiveProject.Machines" 
SelectedItem="Binding SelectedObject, Mode=TwoWay"/>

当我在每个列表中有多个项目时,这很有效,但如果列表只有一个项目,它会失败。当我选择该项目时,SelectedObject 不会更新,因为列表仍然认为它的原始项目已被选中。我相信会发生这种情况,因为当 SelectedObject 不是列表中的对象时,双向绑定只是忽略了来自源的更新,从而使列表的 SelectedItem 保持不变。这样一来,绑定就变得不同步了。

是否有人知道当 SelectedObject 不在列表中时确保列表框重置其 SelectedItem 的方法?有没有更好的方法来解决这个问题?

【问题讨论】:

【参考方案1】:

丹的回答也帮助我解决了我的问题。看起来关键是让绑定对象首先重新绑定到空值,然后再重新绑定到新值。

我的解决方案中没有 Postsharp,也不需要维护所选对象的列表,这是我唯一需要的代码。

    Public Property MyProperty() As Object
        Get
            Return Me._MyProperty
        End Get
        Set(value As Object)
            Me._MyProperty = Nothing

            NotifyOfPropertyChange(Function() MyProperty)

            Me._MyProperty = value

            NotifyOfPropertyChange(Function() MyProperty)
        End Set
    End Property

【讨论】:

【参考方案2】:

好吧,我找到了解决这个问题的方法,但这让我有点不舒服。我将模型中的 SelectedObject 属性修改为:

public Object SelectedObject

    get
    
        return _selectedObject;
    
    set
    
        if (value != _selectedObject)
        
            //HACK
            //Pulse 'null' between changes to reset listening list controls
            if (value != null)
                SelectedObject = null;

            if (_selectedObject != null)
                SelectedObjects.Remove(_selectedObject);

            _selectedObject = value;
            if (value != null)
                SelectedObjects.Add(value);
        
    

这会强制所有数据绑定列表控件在我们更新为“真正的”SelectedObject 之前将其 SelectedItem 重置为 null。附带说明一下,NotifyPropertyChanged 的​​东西正在由 PostSharp 处理,以防您想知道它为什么会丢失。

如果可能的话,我更喜欢一个不那么骇人听闻的解决方案,但我确实喜欢这样一个事实,即这样可以使 XAML 中的绑定保持干净(无需更改。)

【讨论】:

以上是关于双向绑定到 WPF 中多个列表框上的 ListBox SelectedItem的主要内容,如果未能解决你的问题,请参考以下文章

如何在双向绑定组合框(WPF)上调用异步操作

鼠标滚轮在功能区中的列表框上滚动 [WPF]

Wpf的comboBox怎么绑定数据?

使用带有排序组合框和页面组合框上的许多项目的列表视图

WPF 中双向绑定通知机制之ObservableCollection使用

Xml 数据到 WPF TreeView 的双向绑定