2013-01-24 5 views
1

당신의 도움이 필요합니다. 내 응용 프로그램에서 MVVM 디자인 패턴을 사용합니다. 내 데이터 그릿 안에 콤보 박스가있다 :WPF : 런타임에 속성 바인딩이 업데이트되지 않습니다.

<telerik:RadGridView AutoGenerateColumns="False" Name="rgvData" ItemsSource="{Binding Data}"> 
     <telerik:RadGridView.Columns> 
      <telerik:GridViewColumn Header="Department"> 
       <telerik:GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <telerik:RadComboBox 
              ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}},Path=DataContext.Departments}" 
              SelectedValue="{Binding DEP_LINK,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
              SelectedValuePath="LINK" 
              DisplayMemberPath="TITLE"> 
         </telerik:RadComboBox> 
        </DataTemplate> 
       </telerik:GridViewColumn.CellTemplate> 
      </telerik:GridViewColumn> 
     </telerik:RadGridView.Columns> 
    </telerik:RadGridView> 

데이터는 데이터의 ObservableCollection이다. 부서가 DEPARTMENTS의 ObservableCollection입니다. 두 클래스 모두 SQL Server의 엔터티입니다.

이제 DATA 클래스의 IsDepartmentUsed 속성을 기반으로 색을 지정하겠습니다. 다음과 같은 스타일이 있습니다.

<telerik:RadComboBox.Style> 
    <Style TargetType="{x:Type telerik:RadComboBox}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding IsDepartmentUsed}" Value="False"> 
       <Setter Property="Background" Value="Red"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding IsDepartmentUsed}" Value="True"> 
       <Setter Property="Background" Value="Transparent"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</telerik:RadComboBox.Style> 

창이 열리면 제대로 작동합니다. 하지만 콤보 상자의 값을 변경하면 색상이 변경되지 않습니다!

public partial class DATA 
{ 
    public bool IsDepartmentUsed 
    { 
     get 
     { 
      if (this.DEPARTMENTS.ISUSED != null) 
      { 
       return Convert.ToBoolean(this.DEPARTMENTS.ISUSED); 
      } 
      return false; 
     } 
    } 
} 

답변

1

귀하의 UI는 그래서 업데이트 할 필요가 모르는, 속성이 변경되었음을 알 수 없습니다 : 같은

는 IsDepartmentUsed 속성을 보이는 방법은 다음과 같습니다. IsUsed 속성이 변경 될 때마다 IsDepartmentUsed에 대한 PropertyChanged 이벤트 처리기를 트리거해야합니다.

내가 제대로 데이터 계층 구조를 이해 한, 그래서 만약 당신이 당신의 부분 Data 클래스를 추가하거나 제거 Departments 수집에 CollectionChanged 이벤트 핸들러를 첨부 할 수 있습니다, 귀하의 모델을 생성하는 엔티티 프레임 워크 같은 것을 사용하는 것 소리

PropertyChange 이벤트 핸들러를 Department 클래스에 추가하면 IsUsed 속성이 변경 될 때마다 IsDepartmentUsed에 대한 변경 알림이 발생합니다.

void Data() 
{ 
    this.Departments.CollectionChanged += Departments_CollectionChanged; 
} 

void Departments_CollectionChanged (object sender, NotifyCollectionChangedEventArgs e) 
{ 
    if (e.NewItems != null) 
    { 
     foreach(Department item in e.NewItems) 
      item.PropertyChanged += Department_PropertyChanged; 
    } 
    if (e.OldItems != null) 
    { 
     foreach(Department item in e.OldItems) 
      item.PropertyChanged -= Department_PropertyChanged; 
    } 
} 

void Department_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "IsUsed") 
     RaisePropertyChanged("IsDepartmentUsed"); 
} 

난 당신이 Model 레이어를 사용하고 있기 때문에 당신의 Department 클래스 INotifyPropertyChanged를 구현하는 여기에 가정입니다.

은 (코드는 당신이 당신의 C# 코드에서 가지고 그러나 ObservableCollectionISUSED 특성 등이없는, DEPARTMENTSObservableCollection라고 때문에 하드 조금 따라, 그래서 데이터 계층 구조를 오해했을 수 있습니다. 같은 개념을 적용해야합니다. PropertyChanged 이벤트에 PropertyChanged 이벤트를 첨부하면 IsDepartmentUsed 언제든지 IsUsed으로 변경됩니다.

+0

감사합니다. Rachel! 이것은 내가 원하는 것에 거의 가깝다. 몇 가지 사항 : ** DEPARTMENTS **는 자동 생성 된 개체입니다. 학과는 ** ObservableCollection **입니다. ** DATA **와 동일합니다. 따라서 ** DATA ** 클래스에는 ** ObservableCollection **이 없지만 대신 ** DEPARTMENTS ** 클래스가 있습니다. 내가 추가했습니다 : 공공 무효 UpdateIsDepartmentUsedProperty() {OnPropertyChanged ("IsDepartmentUsed"); } ** 데이터 ** 클래스. ViewModel에서 호출하면 모든 것이 올바르게 작동하고 속성이 성공적으로 업데이트됩니다. 그러나 나는 어떤 종류의 '더러운'코드라고 생각합니다. –

관련 문제