나는 다음과 같은 XAML 마크 업이 있습니다WPF 콤보 상자 바인딩 행동
<TextBox x:Name="MyTextBox" Text="{Binding Path=SelectedCustomer.FavouriteProduct.ProductNumber, UpdateSourceTrigger=PropertyChanged}" />
<ComboBox x:Name="MyComboBox" ItemsSource="{Binding Products}" DisplayMemberPath="ProductName"
SelectedValue="{Binding Path=SelectedCustomer.FavouriteProduct.ProductNumber}"
SelectedValuePath="ProductNumber" />
내보기의 DataContext에이 SelectedCustomer라는 공용 속성을 포함하는 뷰 모델에 바인딩됩니다. 고객 오브젝트에는 Product 유형의 FavouriteProduct 특성이 있고 Product 오브젝트에는 Public 특성 ProductNumber 및 ProductName이 들어 있습니다.
내가 찾고있는 동작은 ComboBox의 SelectedItem에서 TextBox의 텍스트를 업데이트하고 그 반대의 경우도 마찬가지입니다. TextBox에 ComboBox는 잘 작동합니다. ComboBox에서 제품을 선택하면 해당 제품의 제품 번호로 TextBox가 업데이트됩니다. 그러나 내가 다른 길로 가려고 할 때 나는 이상한 행동을한다. 선택한 항목 앞에 오는 항목에 대해서만 작동합니다. 내가 설명하려고합니다 :
제품의 다음 목록 고려 ([제품 번호], [제품 이름]) :
- 환타
- 펩시
- 코카콜라
- 스프라이트
- 물
이제 SelectedCustomer의 favouri te 제품은 코카콜라 (개발자 여야 함)입니다. 그래서 창이 열리면 TextBox는 3을 읽고 ComboBox는 Coca Cola를 읽습니다. 아름다운. 이제 TextBox의 제품 번호를 2로 변경할 수 있습니다. ComboBox는 값을 Pepsi로 업데이트합니다. 이제 TextBox의 제품 번호를 Coca Cola (3) 이상의 번호로 변경하십시오. 그리 좋지 않아. 4 (Sprite) 또는 5 (Water)를 선택하면 ComboBox가 코카콜라로 돌아갑니다. 따라서 ItemSource의 목록에서 창 너비를 여는 항목 아래에 아무 것도 작동하지 않는 것 같습니다. 그것을 1 (Fanta)로 설정하고 다른 것은 작동하지 않습니다. 5 (물)로 설정하면 모두 작동합니다. 이 작업은 ComboBox의 초기화 작업과 관련이 있습니까? 잠재적 인 버그? 누군가 다른 사람이이 행동을 본다면 궁금합니다.
UPDATE : SelectedProduct 및 SelectedProductNumber에 대한
마이크 브라운의 응답을 읽은 후 내가 만든 속성. 이 문제는 ComboBox에서 무언가를 선택하자마자 속성이 서로 유지되는 무한 루프에 빠지게됩니다. OnPropertyChanged 처리기를 잘못 구현했거나 누락 된 부분이 있습니까? 나는 두 속성에서 SelectedCustomer.FavouriteProduct를 업데이트 한 후 그 값을 읽을 때 것을 사용하여 약간 이제 구현을 변경 한 2
private int _SelectedProductNumber = -1;
public int SelectedProductNumber
{
get
{
if (_SelectedProductNumber == -1 && SelectedCustomer.Product != null)
_SelectedProductNumber = SelectedCustomer.Product.ProductNumber;
return _SelectedProductNumber;
}
set
{
_SelectedProductNumber = value;
OnPropertyChanged("SelectedProductNumber");
_SelectedProduct = ProductList.FirstOrDefault(s => s.ProductNumber == value);
}
}
private Product _SelectedProduct;
public Product SelectedProduct
{
get
{
if (_SelectedProduct == null)
_SelectedProduct = SelectedCustomer.Product;
return _SelectedProduct;
}
set
{
_SelectedProduct = value;
OnPropertyChanged("SelectedProduct");
_SelectedProductNumber = value.ProductNumber;
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
업데이트 : 여기 내 뷰 모델에서 코드 예제이다. 이제는 작동하지만 올바른 방법이라고 확신하지 못합니다.
private int _SelectedProductNumber = 0;
public int SelectedProductNumber
{
get
{
if (SelectedCustomer.Product != null)
_SelectedProductNumber = SelectedCustomer.Product.ProductNumber;
return _SelectedProductNumber;
}
set
{
_SelectedProductNumber = value;
SelectedCustomer.FavouriteProduct = ProductList.FirstOrDefault(s => s.ProductNumber == value);
OnPropertyChanged("SelectedProductNumber");
OnPropertyChanged("SelectedProduct");
}
}
private Product _SelectedProduct;
public Product SelectedProduct
{
get
{
if (SelectedCustomer.Product != null)
_SelectedProduct = SelectedCustomer.Product;
return _SelectedProduct;
}
set
{
_SelectedProduct = value;
SelectedCustomer.FavouriteProduct = value;
OnPropertyChanged("SelectedProduct");
OnPropertyChanged("SelectedProductNumber");
}
}
오류가 발생했습니다 ... 올바른 코드로 답변을 업데이트했습니다. –
속성이 실제로 변경되지 않았을 때 변경된 이벤트가 발생하지 않도록하려면 'if (_selectedProduct! = value) {/*...*/}'블록을 사용하십시오. –
귀하의 새로운 솔루션은 완벽하게 유효합니다 (실제로 반복되는 정보는 피할 수 있습니다). 그러나 나에게 이상한 점은 스택 오버 플로우가 여전히 발생하고 있다는 것입니다. 나는 코드를 VS에 넣었고 나를 위해 잘 돌아갔다. 너의 편에서 무엇이 잘못 될지 확신하지 못한다. 변경 사항이 selectedcustomer.favoriteproduct로 변경 되었습니까? 다른 두 속성에 대한 업데이트도 필요합니까? 어느 방법을 사용해도 내 샘플 코드를 My Machine (TM)에서 작동하는 버전으로 업데이트했습니다 –