gpt4 book ai didi

c# - 根据MVVM中的复选框列表选择启用WPF按钮

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

我有一个复选框列表项和一个提交按钮。最初需要禁用“提交”按钮。该按钮需要通过选择单个复选框或多个选择来启用。我在XAML中添加了以下代码,后端代码需要使用MVVM的 View 模型。

XAML ..

<ListBox Grid.Row="1" BorderThickness="0" Background="Transparent" Name="list" ItemsSource="{Binding Items}" Margin="10 5 20 0" SelectionMode="Extended">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox Name="check" IsChecked="{Binding IsChecked, Mode=TwoWay}" Margin="5 5 0 10" VerticalAlignment="Center" />
<ContentPresenter Content="{Binding Value}" Margin="5 5 0 10"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

<Button Grid.Row="2" Click="Button_Click" HorizontalAlignment="Right" Height="25" Width="60" Margin="0,0,30,0" IsEnabled="{Binding Path=IsButtonEnabled}"> <TextBlock>Submit</TextBlock> </Button>

那么使用OnPropertyChanged()的 View 模型实现将如何。

最佳答案

您需要注册 View 模型中每个项目的所有PropertyChanged事件并汇总结果。例如:

class ViewModel
{
public ViewModel()
{
Items = new ObservableCollection<Item>();

PropertyChangedEventHandler propertyChangedHandler = (o, e) =>
{
if (e.PropertyName == nameof(Item.IsChecked))
OnPropertyChanged(nameof(IsButtonEnabled));
};

Items.CollectionChanged += (o, e) =>
{
if (e.OldItems != null)
foreach (var item in e.OldItems.OfType<INotifyPropertyChanged>())
item.PropertyChanged -= propertyChangedHandler;
if (e.NewItems != null)
foreach (var item in e.NewItems.OfType<INotifyPropertyChanged>())
item.PropertyChanged += propertyChangedHandler;
};
}

public ObservableCollection<Item> Items { get; }

public bool IsButtonEnabled => Items.Any(i => i.IsChecked);
}

要考虑的另一个选项是使用 ReactiveUI

关于c# - 根据MVVM中的复选框列表选择启用WPF按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38633589/

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