gpt4 book ai didi

wpf - 如何强制ItemsControl验证行更改?

转载 作者:行者123 更新时间:2023-12-03 10:39:18 25 4
gpt4 key购买 nike

我有一个称为ModelPhoneModel和一个称为ViewModelPersonViewModel,它们两个都可以实现INotifyPropertyChangedIDataErrorInfo。在PersonViewModel中,我有一个ObservableCollection<PhoneModel> Phones属性,该属性显示在我的 View 中的ItemsControl中。因此,我创建了一些Command,以从PhoneModel添加和删除Phones项。但是在添加,编辑和删除它们时,不会触发Validation。如何强制ItemsControl验证其内容?有什么办法吗?

public class PhoneModel : INotifyPropertyChanged, IDataErrorInfo {
// has some validation roles and IDataErrorInfo is implemented full
public string Number { get; set; }
}

public class PersonViewModel : INotifyPropertyChanged, IDataErrorInfo {
public ObservableCollection<PhoneModel> Phones { get; set /* implements INotifyPropertyChanged */ ; }
}

并且鉴于:
<ItemsControl ItemsSource="{Binding Phones}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBox
Text="{Binding Number,
UpdateSourceTrigger=PropertyChanged,
Mode=TwoWay,
ValidatesOnExceptions=True,
NotifyOnValidationError=True,
ValidatesOnDataErrors=True}"
/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

你能帮我吗?提前致谢。

更新1

我尝试 @Michael G的答案,但仍然无法正常工作。我的代码在这里:

1)我添加了一个更改集合的事件处理程序:
Phones.CollectionChanged += PhonesChanged;

2),并在其中尝试:
void PhonesChanged(object sender, NotifyCollectionChangedEventArgs e) {
if(e.Action != NotifyCollectionChangedAction.Remove)
return;
var model = e.OldItems[0] as PhoneModel;
if(model != null) {
model.Validate();
OnPropertyChanged(() => Phones);
}
}

3)我也尝试听每个电话项目的属性更改:
foreach(var phone in Phones)
phone.PropertyChanged += new PropertyChangedEventHandler(phone_PropertyChanged);

和:
void phone_PropertyChanged(object sender, PropertyChangedEventArgs e) {
var phone = sender as PhoneModel;
if(phone == null)
return;
phone.Validate();
OnPropertyChanged(() => Phones);
}

最佳答案

收听Phones ObservableCollection上的CollectionChanged事件。

Phones.CollectionChanged += new NotifyCollectionChangedEventHandler(Phones_CollectionChanged);

void Phones_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
//ValidatePhones();
// OnPropertyChanged("Phones"); // Let IDataErrorInfo know
}

另外,您可以在PersonViewModel中监听每个“PhoneModel”的PropertyChanged事件,以在PhoneModel对象的属性更改时调用验证。

关于wpf - 如何强制ItemsControl验证行更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11075748/

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