在对象列表上实现INotifyPropertyChanged?

时间:2018-09-21 14:39:09

标签: c# wpf mvvm data-binding

嗯,不确定我是否选择了正确的方法。 我有一个组件网格。在第一列中,有 DatePickers 。 在第二列中,有组合框。在最后一列中,有文本框。网格有15行。 我用它们的列号和行号来命名它们,就像在网格中为单元格编号一样。 因此, DatePicker 的dp1_1是位置(1,1),dp2_1是位置(2,1)。 组合框的cb1_1是位置(1,1),组合框的cb2_1是位置(2,1)。

我将日期选择器数据,组合框数据和文本框数据保存在普通列表中,以便于访问/引用,例如:

public int numOfRows = 15;
private List<DateTime> _MyDateTimeList = new List<DateTime>();

public List<DateTime> MyDateTimeList
{
    get { return _MyDateTimeList; }
    set {
        DateTime pomDatumObjava;

        _MyDateTimeList = value;

        for (int i = 0; i < numOfRows; i += 1)
        {
            pomDatumObjava = new DateTime();
            // code for accessing/enabling/disabling the appropriate date picker, which doesn't work since I don't know how to send the window reference where my date pickers reside
            // pomDatumObjava = Utils.enableDisableDatePicker(null, Constants.DP_LABEL + stringIndex, true, 1).SelectedDate.Value;
            _MyDateTimeList.Add(pomDatumObjava);
        }

        OnPropertyChanged("MyDateTimeList");
    }
}

public event PropertyChangedEventHandler PropertyChanged;

public void OnPropertyChanged(string name)
{
    Console.WriteLine("OnPropertyChanged -> " + name);
    PropertyChangedEventHandler handler = PropertyChanged;

    if (handler != null)
    {
        Console.WriteLine("handler != null -> " + name);
        handler(this, new PropertyChangedEventArgs(name));
    }
}

public static DatePicker enableDisableDatePicker(System.Windows.Window myWindow, string name, bool enableDisable, double op)
{
    DatePicker dp = (DatePicker)myWindow.FindName(name);

    if (!enableDisable)
    {
        dp.SelectedDate = null;
    }

    dp.IsEnabled = enableDisable;
    dp.Opacity = op;

    return dp;
}

如何访问窗口中的组件并适当地引用它们,以便每次更改某些DatePicker中的值时,都可以检测到列表中的更改?

您可以在注释行中找到实用程序功能。如果显示为null,则应该有放置对象的窗口对象。

或者,这是正确的方法吗?

我将有很多组件(OnPropertyChanged的15x3 = 45 x代码),因此MVVM文件将很大,可以为所有组件设置OnPropertyChanged()。

1 个答案:

答案 0 :(得分:1)

正如ASh所说,您需要一个ObservableCollection对象,每一行一个。当您添加或删除对象时,ObservableCollections会自动更新其绑定控件,并在对象更改时传递事件。这些对象大概具有OnPropertyChanged()的三个属性(对于日期选择器,组合框和文本框)。

然后将ObservableCollection绑定到网格的ItemSource,并将三个控件绑定到项目的三个属性。

对于MVVM,您永远不需要在视图中引用控件。相反,视图应反映ViewModel的状态。如果要禁用日期选择器,则应将其Enabled属性绑定到引发OnPropertyChanged()的某些事物上。

如果您发表观点,我们可以建议如何做到这一点。