-2

我有一个 WPF ViewModel

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但这只允许我用我在文本框中键入的值覆盖属性,这是我并不真正想要的(实际上我仍然需要将其设为只读,但它目前不在范围)。

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

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

4

1 回答 1

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

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

于 2013-03-16T21:38:39.443 回答