双向绑定到 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的主要内容,如果未能解决你的问题,请参考以下文章