2013-05-04 41 views
0

比方說,我有四個組合框(我們稱之爲的cbA1,CBA2,CBB1,cbB2),cbA1和CBB1被綁定到相同的屬性和CBA2和cbB2到在我的viewmodel不同的屬性。在我切換到MVVM之前,我有一些代碼隱藏,確保在cbA1和cbB1中相同的值不相同。他們使用枚舉作爲itemssource。數據綁定單一源向多個ComboBox'es沒有更新所有的人

您必須忽略爲什麼我有這麼多組合框顯示數據的原因,因爲它現在是。我只是無意中偶然發現了這個。

這是它們是如何在XAML構造:

<ComboBox 
    x:Name"cbA1" 
    DisplayMemberPath="Description" 
    SelectedValuePath="Value" 
    SelectedValue="{Binding Window1Page}" 
    ItemsSource="{Binding Source={local:Enumeration {x:Type Enum:eDisplayPages}}}"/> 
<ComboBox 
    x:Name"cbA2" 
    DisplayMemberPath="Description" 
    SelectedValuePath="Value" 
    SelectedValue="{Binding Window2Page}" 
    ItemsSource="{Binding Source={local:Enumeration {x:Type Enum:eDisplayPages}}}"/> 

因此,當我運行應用程序#1組合框顯示從Window1Page數據和#2組合框顯示從Window2Page的數據。我檢查了舊的代碼隱藏,以確保#1組合框中的內容不能位於#2組合框中。這工作得很好。現在我正在轉向MVVM模型,我已經將代碼移入屬性本身。下面是其中一個屬性:

public eDisplayPages Window1Page 
    { 
     get { return _window1page; } 
     set 
     { 
      if (_window1page == value) 
       return; 

      if ((value.Equals(_window2page)) && (value != eDisplayPages.NoDashPage)) 
      { 
       //Can't have them both selecting the same page 
       value = eDisplayPages.NoDashPage; 
      } 

      SetProperty(ref _window1page, value); 
     } 
    } 

儘管這裏沒有真正相關的是枚舉,以幫助您可視化的問題:

public enum eDisplayPages 
{ 
    [Description("NO Layout")] 
    NoDashPage = 0, 
    [Description("Main Layout")] 
    MainDashPage, 
    [Description("Timing Layout")] 
    TimingOnlyDashPage 
} 

所以我看到的問題是,當我改變可以說, cbA1的值與cbA2的值相同,屬性代碼將運行並將值更改爲默認的「NoDashPage」,但它只會更新我沒有進行更改的組合框,在本例中爲cbB1。

用於更改組合框的舊代碼隱藏方法我專注於以及其他組合框。唯一的區別是我曾經將焦點組合框的SelectedValue設置爲新的值,它更新了其他組合框。

我不明白爲什麼它不改變我做了初始選擇的組合框。如果我進入調試器,Window1Page的值是正確的。

雖然我最終會刪除重複的組合框,但我關注的並不是更新是最大的問題。

回答

0

if聲明看起來不自然,我爲什麼要改變(保留的)value變量?

public eDisplayPages Window1Page 
{ 
    get { return _window1page; } 
    set 
    { 
     if (_window1page == value) 
      return; 

     if ((value.Equals(_window2page)) && (value != eDisplayPages.NoDashPage)) 
     { 
      //Can't have them both selecting the same page 
      _window1page = eDisplayPages.NoDashPage; 
     } 
     else 
     { 
      _window1page = value; 
     } 
     //TODO: add some change notification here 
    } 
} 
相關問題