【问题标题】:UWP INotifyPropertyChanged is null (c#)UWP INotifyPropertyChanged 为空(c#)
【发布时间】:2017-08-06 17:31:26
【问题描述】:

根据this instruction,我正在尝试使用 INotifyPropertyChanged 函数来刷新我的 UWP 应用程序中的绑定数据。不幸的是,当数据的值从后面的代码中更改时,事件 PropertyChangedEventHandler 返回 null 值(PropertyChanged = null 在检查此语句期间:if (PropertyChanged != null))。当从应用程序页面更改值时(通过向 TextBox 输入值)PropertyChanged 设置为某个值。

我的 INotifyPropertyChanged 课程:

    public class UserOperation : INotifyPropertyChanged
{
    private int _beginDistance, _endDistance;

    public int BeginDistance {get { return _beginDistance; }
        set
        {
            _beginDistance = value;
            NotifyPropertyChanged("BeginDistance");
        }
    }
    public int EndDistance { get { return _endDistance; }
        set
        {
            _endDistance = value;
            NotifyPropertyChanged("EndDistance");
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

}

在后面的代码中实现:

public sealed partial class PartCreatePage : Page
{

    private UserOperation operation { get; set; }

    public  PartCreatePage()
    {
        this.InitializeComponent();
        operation = new UserOperation();

    }
    private void OperationAck_Button(object sender, RoutedEventArgs e)
    {
        operation.BeginDistance = 500;
    }

还有xaml:

                        <TextBox x:Name="begin_Distance" 
                             Text="{x:Bind operation.BeginDistance, Mode=TwoWay}" 
                             KeyDown="onlyNumeric_KeyDown"
                             Style="{StaticResource OperationFlyout_TextBox}" />

【问题讨论】:

  • “事件PropertyChangedEventHandler返回空值”是什么意思?
  • 这意味着:PropertyChanged = null 在检查此语句期间:if (PropertyChanged != null)
  • 检查是否有帮助。我有类似的问题:stackoverflow.com/questions/42354995/…
  • 同意 Tóth Tibor。看来代码应该是有效的。如果通过将值设置为 operation.BeginDistance 来更改数据,PropertyChanged 将不会为空。

标签: c# null uwp inotifypropertychanged


【解决方案1】:

不确定UWP,但是对于WPF可能是因为你没有指定DataContext,所以接下来值得一试:

public  PartCreatePage()
    {
        this.InitializeComponent();
        operation = new UserOperation();
        this.DataContext = operation;  // or UWP analog  
    }

并且,根据this link,您可能希望将空委托分配给您的 PropertyChangedEventHandler:

public event PropertyChangedEventHandler PropertyChanged = delegate { };

【讨论】:

  • 不,他使用的是x:Bind,所以DataContext 在这种情况下甚至都没有使用。另外,为什么我们要为 PropertyChanged 分配一个空委托?
【解决方案2】:

正确的模式是...

public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
    PropertyChanged handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

参考:MSDN How to Implement Property Change Notification

答案:

不过,要回答您的问题,您的属性更改处理程序为 null 的原因是您没有将数据上下文分配给您的视图模型。

您的代码应在构造函数中设置数据上下文

public sealed partial class PartCreatePage : Page
{

    private UserOperation operation { get; set; }

    public  PartCreatePage()
    {
        this.InitializeComponent();
        DataContext = new UserOperation();
    }

完成此操作后,您的绑定就完成了。您可以通过调用数据上下文并将其转换为您的视图模型来访问它。也就是说,请不要这样做。 MVVM 设计的全部意义在于,您不是在代码后面设置值。

【讨论】:

  • 这是一种更好的做法,可以防止竞争条件,但与 OP 当前的问题无关。
  • @DerrickMoeller 我正在回答这个问题。给我一秒钟
  • 不,他使用的是x:Bind,所以DataContect 不是问题。
【解决方案3】:

我尝试了您的代码并且运行良好。

如果您没有对特定属性的任何绑定,那么 PropertyChanged 为空是完全正确的,因为没有人向它注册事件处理程序,也没有人需要收到有关更改的通知。

【讨论】:

    猜你喜欢
    • 2019-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2020-09-28
    • 2011-06-30
    • 1970-01-01
    相关资源
    最近更新 更多