嗯,不确定我是否选择了正确的方法。 我有一个组件网格。在第一列中,有 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()。
答案 0 :(得分:1)
正如ASh所说,您需要一个ObservableCollection对象,每一行一个。当您添加或删除对象时,ObservableCollections会自动更新其绑定控件,并在对象更改时传递事件。这些对象大概具有OnPropertyChanged()的三个属性(对于日期选择器,组合框和文本框)。
然后将ObservableCollection绑定到网格的ItemSource,并将三个控件绑定到项目的三个属性。
对于MVVM,您永远不需要在视图中引用控件。相反,视图应反映ViewModel的状态。如果要禁用日期选择器,则应将其Enabled属性绑定到引发OnPropertyChanged()的某些事物上。
如果您发表观点,我们可以建议如何做到这一点。