【问题标题】:WPF: Property binding doesn't update at run-timeWPF:属性绑定不会在运行时更新
【发布时间】:2013-01-08 12:19:08
【问题描述】:

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

【问题讨论】:

    标签: wpf mvvm datagrid combobox telerik


    【解决方案1】:

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

    听起来您正在使用 Entity Framework 之类的东西来生成模型,所以如果我正确理解了您的数据层次结构,您的部分 Data 类可以将 CollectionChanged 事件处理程序附加到 Departments 集合,它会在其中的 Department 类中添加或删除 PropertyChange 事件处理程序,这反过来会在 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 类实现了INotifyPropertyChanged,因为您将它用于您的Model 层。

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

    【讨论】:

    • 谢谢,瑞秋!这非常接近我想要的。几点:DEPARTMENTS 是自动生成的实体。部门是 ObservableCollectionDATA 也是如此。所以 DATA 类没有 ObservableCollection,而是有 DEPARTMENTS 类。我添加了: public void UpdateIsDepartmentUsedProperty() { OnPropertyChanged("IsDepartmentUsed"); } 在 DATA 类中。如果我从 ViewModel 调用它,一切正常,并且属性更新成功。但我认为这是某种“肮脏”的代码。
    最近更新 更多