gpt4 book ai didi

WPF MVVM - 监控绑定(bind)对象的更改(例如,如果 IsDirty 则启用保存)

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

在 WPF 中,使用 MVVM 模式(并使用 MVVMLight 工具包),我有一个显示产品可编辑字段的用户控件。此 UC 绑定(bind)到列出所有产品的 ComboBox 中的选定值。

这一切都很好,但是在我的 Product 类中,我有一个名为 IsDirty 的 bool 字段,当 Product 上的任何属性被更新时,它被设置为 true。 只要所选产品(在用户控件中)的 IsDirty 属性为真,我希望在主视图中启用我的保存按钮。 我不知道如何让 IsSaveEnabled 属性“监视” SelectedProduct 中的更改(基本上是在它变脏时)。

我可以通过使用事件处理程序来实现这一点,但是这会将一个事件附加到每个选定的产品上,它看起来又脏又笨重。这是我在如何正确监视绑定(bind)对象的更改方面缺少的东西吗?

Products.xaml (部分的)

<Grid DataContext="{Binding Source={StaticResource ProductsViewModel}}">
<StackPanel>
<ComboBox x:Name="ProductsComboBox"
ItemsSource="{Binding Path=ProductList}"
DisplayMemberPath="Name"
SelectedItem="{Binding SelectedProduct}" />
<uc:Product DataContext="{Binding SelectedItem, ElementName=ProductsComboBox}" />
<Button Content="Save" IsEnabled="{Binding IsSaveEnabled}" Click="Button_Click" />
</StackPanel>
</Grid>

ProductsViewModel.cs (部分的)
public bool IsSaveEnabled
{
get { return SelectedProduct.IsDirty; }
}

public ProductViewModel SelectedProduct
{
get { return _selectedProduct; }
set {
// I can use the next line, but it seems really clunky and creates a ton of event listeners
// value.PropertyChanged += SelectedProduct_PropertyChanged;
Set(() => SelectedProduct, ref _selectedProduct, value);
}
}

// This is the event handler that seems bad form and a duplication of functionality that is already in the Product class
//void SelectedProduct_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
// {
// SelectedProperty.IsDirty = true;
// RaisePropertyChanged(() => IsSaveEnabled);
// }

最佳答案

您可能应该改用命令:

    public static RoutedCommand Command_Save = new RoutedCommand ( );

void Command_Save_Executed ( object sender, ExecutedRoutedEventArgs e )
{
// save the product
}

void Command_Save_CanExecute ( object sender, CanExecuteRoutedEventArgs e )
{
e.CanExecute = SelectedProduct.IsDirty;
}

XAML:
<Button Content="Save" Command="{x:Static MY:ProductsControl.Command_Save }" />

并将其绑定(bind)到控件(在 ctor 或 xaml 中):
            this.CommandBindings.Add( new CommandBinding( Command_SaveAs,
Command_SaveAs_Executed,
Command_SaveAs_CanExecute ) );

命令基础结构将调用您的 CanExecute 事件处理程序来禁用/启用按钮。

关于WPF MVVM - 监控绑定(bind)对象的更改(例如,如果 IsDirty 则启用保存),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29521263/

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