2012-01-27 212 views
3

我花了相當多的時間來研究這個問題。任何幫助將不勝感激。ComboBox雙向綁定到selecteditem

我有一個WPF ComboBox這樣聲明。

<Grid> 
<Grid.RowDefinitions> 
    <RowDefinition/> 
    <RowDefinition/> 
    <RowDefinition/> 
</Grid.RowDefinitions> 
    <Button Click="Button_Click">Click Me</Button> 
    <ComboBox ItemsSource="{Binding ListOfValues}" SelectedItem="{Binding MySelectedItem}" Grid.Row="1"> 
    </ComboBox> 
    <CheckBox IsChecked="{Binding IsValueChecked}" Grid.Row="2"></CheckBox> 
</Grid> 

在我後面的代碼,我有這些屬性,我實現INotifyPropertyChanged的

public Window1() 
    { 
     InitializeComponent(); 
     ListOfValues = new List<string>(); 
     ListOfValues.Add("apple"); 
     ListOfValues.Add("ball"); 
     ListOfValues.Add("cat"); 
     ListOfValues.Add("dog"); 
     MySelectedItem = "cat"; 
     IsValueChecked = true; 
    } 

    public List<string> ListOfValues 
    { 
     get 
     { 
      return _listOfValues; 
     } 
     set 
     { 
      _listOfValues = value; 
      OnPropertyChanged("ListOfValues"); 
     } 
    } 

    public string MySelectedItem 
    { 
     get 
     { 
      return _selectedValueString; 
     } 
     set 
     { 
      _selectedValueString = value; 
      OnPropertyChanged("MySelectedItem"); 
     } 
    } 

    public bool IsValueChecked 
    { 
     get 
     { 
      return _isVlaueChanged; 
     } 
     set 
     { 
      _isVlaueChanged = value; 
      OnPropertyChanged("IsValueChecked"); 
     } 
    } 
    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     MySelectedItem = "dog"; 
     IsValueChecked = !IsValueChecked; 
    } 

按鈕點擊事件改變了這勢必ComboBox的SelectedItem屬性的MySelectedItem。但是在按鈕點擊時,組合框中沒有任何東西被選中。我不明白爲什麼。即使我明確設置Mode = TwoWay,也會發生這種情況。請建議。請注意,我的datacontext設置爲self,所以我已確認數據綁定正在通過添加複選框正確地發生。編輯:請注意,這發生在示例WPF項目中。但我想要這個工作的原始項目是一個winforms應用程序。我正在使用elementhost嵌入我的wpf控件。這是否有所作爲?

回答

3

我試圖重現您的問題,我有一些問題。你能告訴我你的OnPropertyChanged的實現嗎?當我看看MSDN(http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.onpropertychanged.aspx)時,該函數需要一個DependencyPropertyChangedEventArgs作爲第一個參數,而不是字符串。此外,OnPropertyChanged用於通知有關依賴屬性的更改,而不是用於正常屬性。 所以我認爲你重載了該方法來支持INotifyPropertyChanged,對吧?

我試圖執行工作的例子,這是結果:完美的我

public partial class TestWindow2 : Window, INotifyPropertyChanged 
{ 
    public TestWindow2() 
    { 
     InitializeComponent(); 

     ListOfValues = new List<string> { "apple", "ball", "cat", "dog" }; 
     MySelectedItem = "cat"; 
     IsValueChecked = true; 

     this.DataContext = this; 
    } 

    ... 

    public string MySelectedItem 
    { 
     get 
     { 
      return _selectedValueString; 
     } 
     set 
     { 
      _selectedValueString = value; 
      RaisePropertyChanged("MySelectedItem"); 
     } 
    } 

    ... 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     MySelectedItem = "dog"; 
     IsValueChecked = !IsValueChecked; 
    } 

    private void RaisePropertyChanged(String name) 
    { 
     if(this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

作品。當我點擊該按鈕時,狗會在組合框中選中所選項目,並且該複選框會切換其狀態。

+0

這是我提供的一個樣本。編輯該問題以避免混淆。 – 2012-01-27 09:16:13

3

所選項目需要設置爲您綁定到的列表中的某個對象。將它設置爲具有匹配值的字符串將不起作用。所以,試試這個:

foreach(string animal in ListOfValues) 
{ 
    if(animal == "dog") 
     this.MySelectedItem = animal; 
} 
+0

感謝您的回答,但我確認這不是必需的,因爲我的類型是「字符串」類型 – 2012-01-30 06:14:40

0

如果你的項目是引用類型(和你只是用一個例子字符串),檢查equals()方法將返回你所期望的。你可能需要重寫Equals方法(例如this.ID == other.ID或類似的東西)來獲得正確的行爲。

相關問題