我需要你的帮助。 我在我的应用程序中使用MVVM设计模式。我的数据网格中有一个组合框:
<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>
Data是Data的ObservableCollection。 部门是一个ObservableCollection of DEPARTMENTS。 这两个类都是来自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;
}
}
}
答案 0 :(得分:2)
您的用户界面不知道该属性已更改,因此不知道它需要更新。只要PropertyChanged
属性发生更改,您就需要触发IsDepartmentUsed
IsUsed
事件处理程序。
听起来你正在使用像Entity Framework这样的东西来生成你的模型,所以如果我已经正确理解了你的数据层次结构,你的部分Data
类可以将CollectionChanged
事件处理程序附加到Departments
集合,用于向PropertyChange
内的Department
类添加或删除IsDepartmentUsed
事件处理程序,从而随时IsUsed
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
我假设您的DEPARTMENTS
类实现了INotifyPropertyChanged,因为您在ObservableCollection
图层使用它。
(您的代码有点难以理解,因为您说ObservableCollection
是ISUSED
,但PropertyChanged
没有PropertyChanged
属性,例如您所拥有的属性你的C#代码,所以我可能误解了你的数据层次结构。虽然应该使用相同的概念 - 在类的IsDepartmentUsed
事件上附加一些内容,这会引发IsUsed
{{1}}的{{1}}通知{{1}}更改)