【问题标题】:WPF MVVM Databinding Textbox dependency overwriting input or not updating inputWPF MVVM 数据绑定文本框依赖覆盖输入或不更新输入
【发布时间】:2019-02-08 05:32:26
【问题描述】:

这必须是解决此问题的常见问题,但我找不到。 我需要能够在文本框中设置一个值,但文本框通常由外部源(在本例中为 PLC)更新。当它从源更新时,我想在文本框中显示更新的值(而不是在用户键入时),而不调用从依赖属性的设置器调用的方法。

我有一个绑定到视图模型 xaml 代码中的依赖属性的基本文本框。

<TextBox Text="{Binding A}" />

属性看起来像这样

private string _a;
public string A
get
        {
            return _a;
        }
        set
        {
            if (value != _a)
            {
                Set(ref _a, value);
                SomeMethod(value);
            }
        }

从这里我尝试更新字段

_a = ValueFromAnotherSource;

除非我运行,否则不会更新视图

RaisePropertyChanged(String.Empty);

在这种情况下,如果值更新,用户输入的输入将被覆盖。

或者我可以写信给属性

A = ValueFromAnotherSource;

但是 SomeMethod(value) 被调用,这不是我想要的,只有当用户在屏幕上输入改变值时才应该调用它

【问题讨论】:

  • 函数Set触发NotifyPropertyChanged对吧?
  • 这永远不会令人满意。想象一下,用户将输入焦点永远留在了 TextBox 中。它永远不会显示视图模型中的更新值。您实际上需要两个 UI 元素,一个用于输入,一个用于输出。
  • 绑定 sourceupdated 事件可用于驱动数据从文本框传输到视图模型。

标签: c# wpf mvvm


【解决方案1】:

我相信编码标准的上帝会为此痛打我:

private string _a;
private bool _manuallySettingA;
public string A
{
    get { return _a; }
    set
    {
        if (value != _a)
        {
            Set(ref _a, value);
            if(!_manuallySettingA)
                SomeMethod(value);
        }
    }
}

public void ManuallySetA(string value)
{
    _manuallySettingA = true;
    A = value;
    _manuallySettingA = false;
}

【讨论】:

  • 我最终做了一些事情,我使用 xmlns:Custom="galasoft.ch/mvvmlight" x:Class="RAMware3.TabView.TabSetupSetup2" 中的 EventToCommand 来设置一个中继命令,该命令调用如果 A 的值实际更新,则为 ManuallySetA 的函数,它会查找布尔集。
【解决方案2】:

使用当更新来自用户输入以外的其他来源时调用的不同方法。即

void SetA(string value)
{
  if (value != _a)
  {
      Set(ref _a, value);
  } 
}

您将能够区分呼叫是来自用户还是来自其他来源。

当需要从其他来源更新 _a 时,您不会调用 SomeMethod

当然,如果您提到的 Set(ref _a, value) 方法引发 PropertyChanged 事件,SetA 将更新 UI 值。

【讨论】:

    猜你喜欢
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 2016-06-12
    • 2015-10-16
    • 1970-01-01
    • 2012-11-24
    相关资源
    最近更新 更多