【问题标题】:WPF TextBox won't update to programmatic change in ViewModelWPF TextBox 不会更新为 ViewModel 中的编程更改
【发布时间】:2013-03-16 21:35:15
【问题描述】:

我有一个 WPF 视图模型

class MainWindowViewModel : INotifyPropertyChanged
    {
        private string _sql;

        public string Sql
        {
            get { return _sql; }
            set
            {
                if (value == _sql) return;
                OnPropertyChanged("Sql");
                _sql = value;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
}

我还有一个带有 TextBox 的 XAML 视图

<Window.Resources>
    <HbmSchemaExporter:MainWindowViewModel x:Key="viewModel"/>
</Window.Resources>
....

<TextBox Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="2" Text="{Binding Source={StaticResource ResourceKey=viewModel}, Path=Sql,Mode=OneWay}"/>

后面的代码

    private MainWindowViewModel ViewModel
    {
        get { return Resources["viewModel"] as MainWindowViewModel; }
    }

问题是当我在代码中执行viewModel.Sql = SOMETHING 时,文本框没有得到更新。调试器在属性中显示正确的值,但文本框保持空白。

我还尝试将绑定更改为TwoWay,但这仅允许我用我在文本框中键入的值覆盖属性,这是我并不真正想要的(实际上我仍然需要将其设为只读,但目前不在范围内)。

以编程方式更新属性后如何更新文本框?

该应用程序基本上是我在阅读this 后编写的 NHibernate DDL 生成器。我需要按下“生成 SQL”按钮,它会显示要在 DB 上运行的代码。

【问题讨论】:

  • OP 评论:一旦我让应用程序正常工作,而不仅仅是使用单个程序集,我可能会开源它

标签: c# wpf data-binding


【解决方案1】:
public string Sql
{
    get { return _sql; }
    set
    {
        if (value == _sql) return;
        OnPropertyChanged("Sql");
        _sql = value;
    }
}

这没有意义。在调用任何PropertyChanged 事件处理程序时,读取Sql 仍将给出旧值,因为您尚未更新_sql。您需要先更新值,然后才引发PropertyChanged 事件。

【讨论】:

  • 成功了!实际上,几个月前我从一个示例中复制了该代码片段,但我从未使用过具有编程更新属性的数据绑定。我认为 OnPropertyChanged 背后是一种异步机制(类似于“在处理程序完成 UI 线程扫描标记为更新的属性之后”)
  • @djechelon 实际上,某些控件可能会按照您描述的方式进行更新,没有技术上的原因不能。但这取决于用于PropertyChanged 的任何事件处理程序。如果您无法控制它,则必须假设它可能会直接读取该属性。
猜你喜欢
  • 2023-04-03
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多