2012-01-27 4 views
3

이 문제를 조사하는 데 많은 시간을 할애했습니다. 어떤 도움이라도 대단히 감사하겠습니다.콤보 상자 선택 항목에 양방향 바인딩

나는 이와 같이 선언 된 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> 

뒤에, 나는 이러한 속성을 가지고 그리고 난 버튼 클릭 이벤트가 콤보 상자의 selectedItem가 속성에 바인딩 된 MySelectedItem를 변화에서 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; 
    } 

을 구현하고있다. 그러나 버튼 클릭시 콤보 박스에서 아무 것도 선택되지 않습니다. 이유는 모르겠다. 이것은 명시 적으로 Mode = TwoWay로 설정 한 경우에도 발생합니다. 제발 제안 해주세요. 내 datacontext 자체로 설정되어 있으므로 확인란을 추가하여 제대로 데이터 바인딩이 발생하는지 확인했습니다.

EDIT : 샘플 WPF 프로젝트에서 발생합니다. 하지만 내가 원했던이 프로젝트는 winforms 앱이다. 내 wpf 컨트롤을 포함하려면 elementhost를 사용하고 있습니다. 그것은 변화를 가져오고 있습니까?

답변

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

내가 제공 한 샘플이었습니다. 혼동을 피하기 위해 질문을 수정했습니다. –

3

선택한 항목을 바인딩 할 목록의 개체로 설정해야합니다. 일치하는 값을 가진 문자열로 설정하면 작동하지 않습니다. 따라서 이것을 시도하십시오 :

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

답변 해 주셔서 감사합니다.하지만 내 유형이 "문자열"유형이므로 필요하지 않음을 확인했습니다. –

0

항목이 참조 유형이고 예제 용 문자열 만 사용하는 경우 Equals() 메서드가 예상 한 값을 반환하는지 확인하십시오. 올바른 동작을 얻으려면 Equals 메서드 (예 : this.ID == other.ID 또는 그와 비슷한 것)를 재정의해야 할 수 있습니다.