【问题标题】:OnPropertyChanged wont change when used wth observable collection and single property与 observablecollection 和单个属性一起使用时,OnPropertyChanged 不会改变
【发布时间】:2016-09-08 01:59:58
【问题描述】:

加载 dataGrid 并在 Datagrid 中填充一行 1'

public partial class MainWindow : Window
{
    public MainWindow()
    {

        InitializeComponent();
        update();
        //this.DataContext = this;



    }
    CricketEvent events = new CricketEvent();

    private void update()
    {
        events.updateList(new CricketEvent[1] { new CricketEvent(){Runs="1"} });
        DG1.ItemsSource = events.RunsList;
    }
    private void DG1_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
    {
        Window1 windowToOpen = new Window1();
        var selectedUser = this.DG1.SelectedItem;
        windowToOpen.Show();

    }
}

加载 OnPropertyChanged 的​​主类我有一个调用 OnPropertyChanged 的​​ List 属性和字符串属性,但我希望单独更新“Runs”属性而不是整个集合。

class CricketEvent : INotifyPropertyChanged

{
    private ObservableCollection<CricketEvent> runsList;
    public string runs { get; set; }


    public CricketEvent(string numofRuns) {
        this.Runs = numofRuns;
    }
    public CricketEvent() { }

    public event PropertyChangedEventHandler PropertyChanged;

    public ObservableCollection<CricketEvent> RunsList

    {
        get { return this.runsList; }

        set
        {
            if (value != this.runsList)
            {
                this.runsList = value;
                OnPropertyChanged("RunsList");
            }
        }
    }
    public string Runs
    {
        get { return runs; }
        set
        {
            runs = value;
            // Call OnPropertyChanged whenever the property is updated
            OnPropertyChanged("Runs");
        }
    }


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


    public ObservableCollection<CricketEvent> updateList(CricketEvent []events)
    {
        runsList = new ObservableCollection<CricketEvent>(events.ToList()); 

        return runsList;
    }

}

这是弹出一个文本框的更新窗口,应该将前一个窗口中的“1s”更改为在文本框中输入的任何内容

public partial class Window1 : Window
{

    public Window1()
    {


        InitializeComponent();
    }

    CricketEvent events = new CricketEvent();
    MainWindow main = new MainWindow();
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        events.updateList(new CricketEvent[1] { new CricketEvent(txt1.Text.ToString()) });

        main.DG1.ItemsSource = events.RunsList;

    }

【问题讨论】:

  • events.updateList(...) 不会神奇地设置events.RunsList,除非你写events.RunsList = events.updateList(...);

标签: wpf datagrid inotifypropertychanged propertychanged


【解决方案1】:

Window1 中的 Button_Click 事件不使用显示的 MainWindow 实例 - 它创建一个新的 Window 实例(未显示)并将更新的列表添加到 DG1.ItemsSource 属性。要解决这个问题,请将 Window 的原始实例传递给构造函数中创建的 Window1 并使用它。

但是,您应该检查您的更新策略(和代码风格),因为有改进的潜力:

  • 如果您只想更新一个项目的一个属性,则创建新集合不是一个好主意。可观察集合提供更改通知,因此您根本不必重新创建集合。

  • 不要在后面的代码中分配集合,而是使用数据绑定将集合绑定到 ItemsSource。如果集合或您的集合中的一项发生更改,DataBinding 会导致 GUI 元素自动更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 2011-09-29
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    相关资源
    最近更新 更多