2010-03-16 105 views
4

我有一個場景,我有一個全局可用的屬性窗口(類似於Visual Studio中的屬性窗口),它綁定到我的模型的SelectedObject屬性。我有很多不同的方法來瀏覽和選擇對象,所以我的第一個嘗試是直接將它們綁定到SelectedObject。例如:雙向綁定到列表框SelectedItem WPF中的多個列表框

<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

嗯,我找到了解決這個問題的方法,但它讓我有點生病。我修改我的模型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); 
     } 
    } 
} 

這將迫使所有綁定列表控件自己的SelectedItem重置爲空,我們才能更新到「真正的」 SelectedObject數據。在旁註中,NotifyPropertyChanged的東西正在被PostSharp處理,以防你想知道爲什麼它丟失了。

我寧願少hackish的解決方案,如果可能的話,但我不喜歡的事實,這保持在XAML乾淨(無需改變。)

3

丹的回答幫我解決我的問題太綁定。看起來好像關鍵是要將綁定對象首先重新綁定爲空值,然後再綁定到新值。

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