【问题标题】:MVVM - Auto Reset flag implementationMVVM - 自动重置标志实现
【发布时间】:2017-09-12 20:31:15
【问题描述】:

我的自定义控件中有一个布尔属性。我有一个属性更改的回调方法,每当视图更新属性时,我都会重置标志值,即视图会将属性值设置为 true,在自定义控件中,我正在做一些处理并将属性值设置回 false .当我将自定义控件中的属性值更新为 false 时,它​​不会更新到视图端。

自定义控件:

public bool ResetFlag
    {
        get { return (bool)GetValue(ResetFlagProperty); }
        set { SetValue(ResetFlagProperty, value); }
    }
public static readonly DependencyProperty ResetFlagProperty = DependencyProperty.Register("ResetFlag", typeof(bool), typeof(ExtendedTextBox), new PropertyMetadata(false, OnResetFlagChanged));

private static void OnResetFlagChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var extendedTextBox= d as ExtendedTextBox;
    if (extendedTextBox== null)
    {
        return;
    }
    if ((bool)e.NewValue)
    {
        //Do processing here
        extendedTextBox.ResetFlag = false;
    }
}

视图模型:

<StackPanel>
    <local:ExtendedTextBox ResetFlag="{Binding ResetValue,Mode=TwoWay}"/>
    <Button Content="ResetFlag" Click="Button_Click"/>
</StackPanel>

public bool ResetValue
{
    get { return (bool)GetValue(ResetValueProperty); }
    set { SetValue(ResetValueProperty, value); }
}

public static readonly DependencyProperty ResetValueProperty = DependencyProperty.Register("ResetValue", typeof(bool), typeof(MainWindow), new PropertyMetadata(false));

private void Button_Click(object sender, RoutedEventArgs e)
{
    ResetValue = true;
}

当我在自定义控件中将布尔标志设置为 false 时,有人可以帮助我理解为什么视图模型中没有反映该值吗?

【问题讨论】:

  • 如果没有一个好的minimal reproducible example 可以可靠地重现您的问题,就无法确定。但是,当 WPF 正在处理另一个方向的更新时,WPF 通常会禁用一个方向的绑定更新。目前尚不清楚是什么导致您进行此设计,但我怀疑这是管理您正在尝试做的事情的最佳方式。您应该发布一个询问更广泛问题的问题,而不是这个特定的实现。见XY Problem
  • 旁注:您不需要在ViewModel 中使用DependencyProperty,只需一个“普通”Property
  • @PeterDuniho 感谢您的建议。我将更新问题,或者我将在不同的线程中创建新问题。
  • @FlatEric 是的,我可以使用普通的CLR property 而不是DependencyProperty。但这并不能解决我面临的问题。
  • @FlatEric 是对的:如果它不能解决“您的问题”,那是因为您做错了其他事情(未设置 DataContext,VM 未实施正确的方法等...)

标签: c# wpf mvvm data-binding binding


【解决方案1】:

您为什么要在 MainWindow 类中定义另一个 ResetValue 属性?您应该设置ExtendedTextBox 控件的ResetFlag 属性。

在您的 XAML 标记中为控件提供 x:Name

<local:ExtendedTextBox x:Name="ctrl" ResetFlag="{Binding ResetValue,Mode=TwoWay}"/>

...并在您的Button_Click 事件处理程序中设置控件的属性:

private void Button_Click(object sender, RoutedEventArgs e)
{
    ctrl.ResetValue = true;
}

【讨论】:

  • 我正在遵循 MVVM 方法(我知道我已经在 xaml.cs 中编写了代码),因此该属性在 MainWindow 类中声明。
  • 什么?您有两个属性,但您设置了错误的属性。您应该设置控件的属性,而不是窗口的。
猜你喜欢
  • 2013-02-11
  • 2011-09-09
  • 2011-05-23
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
相关资源
最近更新 更多