gpt4 book ai didi

c# - WPF ItemsControl 不刷新

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

我正在开发一个 WPF 项目。我有这样的课:

public class Field
{
public ReservationDTO reservation { get; set; }

public DelegateCommand FieldChangeCommand { get; set; }

public bool Available { get; set; }
}

我收藏了它
public ObservableCollection<Field> Fields { get; set; }

我的观点看起来像这样
<ItemsControl ItemsSource="{Binding Fields}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid
Columns="{Binding Columns}"
Rows="{Binding Rows}"
/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Command="{Binding FieldChangeCommand}" CommandParameter="{Binding}" Content="{Binding reservation.Statusz}" FontSize="5" IsEnabled="{Binding Available}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

这在加载时第一次完美运行。但后来我可能会更改字段的一些值。例如:(部分 View 模型代码)
Fields[SelectedIndex].reservation.Statusz = "Sold";
Fields[SelectedIndex].Available = false;
OnPropertyChanged("Fields");
OnPropertyChanged("Available");

确保字段在此之后得到更新,因为 View 上的其他元素(如文本框)刷新。但是 View 上的按钮网格不会随着字段的新值而更新。

有人可以告诉我为什么,以及如何解决这个问题吗?

最佳答案

按钮的内容绑定(bind)到 ReservationDTO 类的 Statusz 属性,这意味着需要实现 INotifyPropertyChanged 才能使按钮内容更改为“已售出”。可以理解,您不希望它出现在您的 DTO 类(class)中。

对 OnPropertyChanged 的​​调用对我来说也是错误的(我假设您的 ViewModel 上有 Fields 属性并且是从 ViewModelBase 继承的类?

您需要执行以下操作(请注意,我没有为您的 _reservation 字段添加任何空引用检查):

public class Field : INotifyPropertyChanged
{
private bool _available;
private ReservationDTO _reservation;

public string Statusz
{
get
{
return _reservation.Statusz;
}
set
{
if (_reservation.Statusz != value)
{
_reservation.Statusz = value;

OnPropertyChanged("Available");
}
}
}

public DelegateCommand FieldChangeCommand { get; set; }

public bool Available
{
get
{
return _available;
}
set
{
if (_available != value)
{
_available = value;

OnPropertyChanged("Available");
}
}
}

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{
var localHandler = this.PropertyChanged;

if (localHandler != null)
{
localHandler(this, new PropertyChangedEventArgs(propertyName));
}
}
}

然后将您的按钮绑定(bind)更改为:
<Button Command="{Binding FieldChangeCommand}" CommandParameter="{Binding}" Content="{Binding Statusz}" FontSize="5" IsEnabled="{Binding Available}"/>

关于c# - WPF ItemsControl 不刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30383695/

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