2013-01-24 104 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> 

時,剛打開的窗口,它工作正常。但是如果我改變組合框的值,它不會改變顏色!

這裏怎麼IsDepartmentUsed財產的樣子:

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

回答

1

您的UI不知道屬性已經改變,所以不知道它是否需要更新。每當IsUsed屬性更改時,您都需要觸發PropertyChanged事件處理程序IsDepartmentUsed

這聽起來像你正在使用類似實體框架來生成你的模型,所以如果我理解正確的數據層次,你的部分Data類可以附加一個CollectionChanged事件處理程序Departments集合,添加或刪除一個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"); 
} 

我在這裏假設你的Department類,因爲你正在使用它爲您Model層實現INotifyPropertyChanged

(你的代碼是一個有點難以遵循,因爲你說DEPARTMENTSObservableCollection,但是一個ObservableCollection不具有ISUSED屬性,如你在C#代碼都有,所以我可能誤解了你的數據的層次結構,同樣的概念應該適用 - 附加東西到PropertyChanged事件的類,這會引發PropertyChanged通知IsDepartmentUsed每當IsUsed更改)

+0

謝謝,瑞秋!這與我想要的非常接近。一些觀點:** DEPARTMENTS **是自動生成的實體。部門是** ObservableCollection **。與**數據**一樣的東西。所以**數據**類沒有** ObservableCollection **,但有** DEPARTMENTS **類代替。我已經添加了:public void UpdateIsDepartmentUsedProperty(){OnPropertyChanged(「IsDepartmentUsed」); }在** DATA **類中。如果我從ViewModel調用它,一切正常,並且該屬性更新成功。但我認爲它是某種「骯髒」的代碼。 –

相關問題