gpt4 book ai didi

c# - 根据集合的每个元素中的字段来保持单个 UI 元素更新的高效方法是什么?

转载 作者:行者123 更新时间:2023-12-03 11:01:57 25 4
gpt4 key购买 nike

关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。












想改进这个问题?将问题更新为 on-topic对于堆栈溢出。

2年前关闭。




Improve this question




我有一个应用程序,其中 ItemsSource多个控件是 ObservableCollection由 ViewModel 提供。集合的项目(其字段的类 - 准确地说 -)也实现了 INotifyPropertyChanged必要时作为ObservableCollection通常不会跟踪其包含的项目中的更改。
现在我有一个按钮(或任何控件),它的 Button.IsEnabled取决于集合中存在的每个项目中的一个字段。

最初,我计划为 INotifyPropertyChanged 使用处理程序。遍历整个 Collection 以检查每个元素的各自字段值以设置 Button.IsEnabled 的事件相应的属性 - 每次在可能巨大的集合中发生变化时。对我来说,这看起来不是一个非常高效的想法。

我的 View 模型:ViewModelClass.cs

class ViewModelClass : Window{
ObservableCollection<DisplayData> list = new ObservableCollection<DisplayData>();

//constructor
ViewModelClass{
list = GetDisplayDataList()
}

class DisplayData : INotifyPropertyChanged{
string Name{get;set;};
bool DeactivateButton{get;set;};
// This is simplified, "set" calls NotifyPropertyChanged();

event PropertyChangedEventHandler PropertyChanged;
void NotifyPropertyChanged([CallerMemberName] string propertyname =""){
if(PropertyChanged != null){ PropertyChanged(this, new PropertyChangedEventArgs(propertyname))};
}
}
}

我的用户界面: ViewClass.xaml
<base:ViewModelClass x:Class="myproject.mynamespace.ViewClass">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Button x:Name="MyButton" Grid.Column="0" Content="Print Error"/>
<!-- Other UI Elements, eg ListBox where the binding of a whole Collection makes sense-->
<ListBox x:Name="MyListBox" ItemsSource="{Binding}" Grid.Column="1">
<ListBox.ItemTemplate>
<DataTemplate>
<Textblock Text="{Binding Name, Mode=OneWay}"/>
<!-- etc.-->
<DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</base>
ViewClass.xaml.cs
partial class ViewClass : ViewModelClass{
ViewClass() : base(){
InitializeComponent();
Init();
}

Init(){
MyListBox.ItemsSource = base.list;
}
}

在这种情况下,迭代 Collection 并检查 DisplayElement.DeactivateButton 属性是我最好的解决方案,如果 true 的数量应该动态确定是否 MyButton.IsActivated ?

最佳答案

如果 IsEnabled取决于所有项目,你应该如何设置它而不迭代整个集合?您当然可以使用 LINQ 来简化代码,但您仍然需要迭代

一旦你设置了初始值,你就可以处理 PropertyChanged集合中每个项目的事件,并确保在字段更改时触发此事件。然后您只需要检查修改项的字段的当前值。您可以在事件处理程序中执行此操作。

private void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
{
IsEnabled = collection.All(x => x.field);
}

关于c# - 根据集合的每个元素中的字段来保持单个 UI 元素更新的高效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57497156/

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