簡體   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