2

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

1 回答 1

2

您的 UI 不知道该属性已更改,因此不知道它需要更新。每当属性更改时,您都需要触发PropertyChanged事件处理程序。IsDepartmentUsedIsUsed

听起来您正在使用 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类实现了INotifyPropertyChanged,因为您将它用于您的Model层。

(你的代码有点难以理解,因为你说DEPARTMENTS的是​​ an ObservableCollection,但是 anObservableCollection没有ISUSED你在 C# 代码中的属性,所以我可能误解了你的数据层次结构。同样的概念应该适用 - 附加一些东西到类的事件,每当更改时都会PropertyChanged引发PropertyChanged通知)IsDepartmentUsedIsUsed

于 2013-01-24T17:13:30.257 回答