【问题标题】:NotifyPropertyChanged not working when updating model更新模型时 NotifyPropertyChanged 不起作用
【发布时间】:2015-02-26 21:01:14
【问题描述】:

注意:我使用的是 PostSharps NotifyPropertyChanged 属性。

当我在 ctor 中设置属性时,我在视图中看到文本框更新,但是如果我将单击事件连接到按钮并将相同的属性设置为其他属性,则文本框不会更新。我做错了什么?

public partial class TestForm : Window
{
    private MyViewModel _vm;
    public TestForm()
    {
        InitializeComponent();
        _vm = new MyViewModel();
        DataContext = _vm;
        _vm.MyText = "Test 1"; //Updates in UI
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        _vm.MyText = "Test 2"; //No update in UI
    }
}

[NotifyPropertyChanged]
public class MyViewModel
{
    public string MyText { get; set; }
}

查看

<Window x:Class="MyApp.Forms.Activate.TestForm"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Width="300" Height="300">
<Grid>
    <TextBox HorizontalAlignment="Left" Height="23" 
             TextWrapping="Wrap" Text="{Binding Path=MyText}" 
             Margin="0,123" Width="100" />
    <Button Content="Button" Margin="29,154,0,0" 
            VerticalAlignment="Top" Width="75"
            Click="Button_Click"/>
</Grid>

【问题讨论】:

  • 通过反编译器运行已编译的程序集,并确保 PostSharp 已按预期编入代码。
  • 它没有向标有属性的类添加任何内容:(

标签: wpf inotifypropertychanged postsharp


【解决方案1】:

你需要在你的模型上实现 INotifyPropertyChanged

public class MyViewModel : INotifyPropertyChanged
{
    private string _myText
    public string MyText { get {return _myText;} set { if (value != _myText) _myText = value; RaisePropertyChanged(); } }
    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    public virtual void RaisePropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

}

我没有通过编译器抛出它,但它看起来是正确的;-)

【讨论】:

  • 我正在使用 PostSharp,所以所有这些样板代码都消失了。
【解决方案2】:

我认为 NotifyPropertyChanged 属性不起作用。反正我从来没见过。

试试这样的:

public class MyViewModel : INotifyPropertyChanged
{
    private string _myText;
    public string MyText
    {
        get
        {
            return _myText;
        }
        set
        {
            if (_myText != value)
            {
                _myText = value;
                OnPropertyChanged("MyText");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

【讨论】:

  • OnPropertyChanged 有一个小问题。在某些多线程条件下,您并没有阻止 PropertyChanged 变为 null。 @Dustin 的代码可以。
【解决方案3】:

为您的文本框绑定到 PropertyChanged 提供一个 UpdateSourceTrigger。

【讨论】:

    【解决方案4】:

    事实证明代码没有任何问题。重新安装 PostSharp 后,它开始工作。

    【讨论】:

      猜你喜欢
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 2021-01-28
      • 1970-01-01
      相关资源
      最近更新 更多