0

我有一个关于更新可观察集合的问题。我正在使用 Visual Studio 2010 c#。我是一个相对新手,可能犯了一个灾难性的错误,所以很抱歉开始。基本上,当我在 Windows 7 上运行此代码时,此代码运行良好,但在 Windows 8 上,我得到了NullReferenceExceptionPropertyChanged。

我有一个包含 Tasks 可观察集合的类。

任务.cs

namespace TimeLocation
{
    public static class TStatic
    {
        static TStatic()
        {
            TaskList = new ObservableCollection<Tasks>(); 
        }
        public static ObservableCollection<Tasks> TaskList { set; get; }
    }


public class Tasks : INotifyPropertyChanged
{
    public int taskID;
    public string taskname;

    public Tasks(string tname)
    {

        this.taskname = tname;
    }



    public string Taskname
    {
        get { return taskname; }
        set
        {
            if (value != "")
            {
                taskname = value; OnPropertyChanged("Taskname");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

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

        }
    }
}

我在 MainWindow 中有一个绑定到 Tasks 的网格,并且通过PropertyChanged上面的更新更新很好。用户还可以通过用鼠标拖动来编辑任务。我希望它也能更新网格和可观察的集合。在 Windows 7 上运行时,这有效,但在 Windows 8 上失败。

在 mainwindow.xaml 的代码后面

public partial class MainWindow : INotifyPropertyChanged
{

    public MainWindow()
    {

        InitializeComponent();

        DataContext = TStatic.TaskList;
    }

    private void dCanvas_PreviewMouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        Tasks t = _selectedtask;
        t.taskname = "Test";
        PropertyChanged(t, new PropertyChangedEventArgs("Taskname"));
    }
}

我确信任务名称已更新,因为当我将其保存到文件并添加手表时名称已更改。

_selectedtask已通过选择网格行填充了一项任务。

在 Windows 8 中,该行

PropertyChanged(t, new PropertyChangedEventArgs("Taskname"));

返回空错误。在 Windows 7 中,它不为空并正确更新网格。

4

1 回答 1

1

首先,公共字段声明是一种非常糟糕的做法。您应该将它们设为私有,并在需要时通过公共属性授予对它们的访问权限。

其次,像 Window 这样的 ui 元素不应该实现 INotifyPropertyChanged 接口。您为视图模型类实现它(参见 MVVM 模式,wpf 应用程序的推荐方法)或至少为您的任务之类的数据类实现它。

在您的 dCanvas_PreviewMouseLeftButtonUp 代码中,更新可能不起作用,因为您更新了 Tasks 对象的字段,但调用了 MainWindow 的 PropertyChanged 方法。设置 TaskName 属性就足够了:

t.TaskName =  "Test"
于 2017-04-26T11:36:14.180 回答