繁体   English   中英

在WPF中的多个列表框上的TwoWay绑定到ListBox SelectedItem

[英]TwoWay Binding to ListBox SelectedItem on more than one list box in WPF

我有一个场景,我有一个全局可用的属性窗口(类似于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的方法? 有没有更好的方法来做到这个没有这个问题?

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

在我的解决方案中没有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

好吧,我找到了绕过这个问题的方法,但这让我有些不适。 我将模型中的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。 另外,PostSharp正在处理NotifyPropertyChanged的内容,以防你想知道为什么它丢失了。

如果可能的话,我更喜欢一个不太讨厌的解决方案,但我确实喜欢这样一个事实:这样可以保持XAML中的绑定清晰(无需更改)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM