WPF:属性绑定不会在运行时更新

时间:2013-01-24 16:49:25

标签: wpf mvvm datagrid combobox telerik

我需要你的帮助。 我在我的应用程序中使用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;
        }
    }
}

1 个答案:

答案 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图层使用它。

(您的代码有点难以理解,因为您说ObservableCollectionISUSED,但PropertyChanged没有PropertyChanged属性,例如您所拥有的属性你的C#代码,所以我可能误解了你的数据层次结构。虽然应该使用相同的概念 - 在类的IsDepartmentUsed事件上附加一些内容,这会引发IsUsed {{1}}的{​​{1}}通知{{1}}更改)