gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:16:24 27 4
gpt4 key购买 nike

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

最佳答案

您的 UI 不知道该属性已更改,因此不知道它需要更新。您需要触发 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类实现 INotifyPropertyChanged因为您将它用于您的 Model层。

(您的代码有点难以理解,因为您说 DEPARTMENTSObservableCollection ,但是 ObservableCollection 没有 ISUSED 属性,例如您在 C# 代码中的属性,所以我可能误解了您的数据层次结构。同样的概念应该适用 - 将一些东西附加到类的 PropertyChanged 事件上,这会引发 PropertyChangedIsDepartmentUsed 通知,只要 IsUsed 发生变化)

关于WPF:属性绑定(bind)不会在运行时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14506498/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com