WPF中多个ListBox的SelectedItem的双向绑定

4

我有一个场景,其中我有一个类似于Visual Studio中的属性窗口的全局可用Properties窗口,它绑定到我的模型的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吗?是否有更好的方法可以避免这个问题?

2个回答

3

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

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

1

好的,我找到了解决问题的方法,但是这让我有点不舒服。我修改了我的模型中的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处理的,如果你想知道它为什么丢失了。

如果可能的话,我更喜欢一种不那么hackish的解决方案,但我确实喜欢这个方法可以保持XAML中的绑定干净(无需更改)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接