预期行为
我如何尝试实施
日期间隔和日期选择器的XAML代码
<ComboBox ItemsSource="{Binding Source={StaticResource viewByInterval}}"
SelectedValuePath="Value"
SelectedItem="{Binding IntervalMode,Mode=TwoWay}" />
<DatePicker SelectedDate="{Binding EndDate,Mode=TwoWay}"
IsEnabled="{Binding Path=EndDateEnabled[0],Mode=TwoWay}">
查看更改EndDateEnabled的模型代码
public bool EndDateEnabled { get; set; }
public DateMode IntervalMode
{
get
{
return _dateModeValue;
}
set
{
_dateModeValue = value;
EndDateEnabled = (value == DateMode.CustomDateRange);
}
}
我无法实现这项功能。 请指教。
答案 0 :(得分:4)
您不需要[0]
部分(它是bool,而不是集合),绑定不需要TwoWay
:
IsEnabled="{Binding Path=EndDateEnabled}"
您还需要在ViewModel中实现INotifyPropertyChanged
,并为PropertyChanged
属性(以及您的视图绑定的所有属性)引发EndDateEnabled
事件:
private bool _endDateEnabled;
public bool EndDateEnabled
{
get { return _endDateEnabled; }
set
{
if (value != _endDateEnabled)
{
_endDateEnabled = value;
OnPropertyChanged("EndDateEnabled");
}
}
}
请注意,EndDateEnabled
也可以是仅具有getter的计算属性:
public bool EndDateEnabled
{
get { return _dateModeValue == DateMode.CustomDateRange; }
}
在这种情况下,您需要在OnPropertyChanged("EndDateEnabled")
设置器中调用DateModeValue
,以便刷新绑定。
答案 1 :(得分:0)
我看到有两个问题。首先,您对EndDateEnabled的绑定看起来应该更像:
IsEnabled="{Binding Path=EndDateEnabled}"
由于绑定的目标只是计划bool属性,因此[0]无效或不必要。 TwoWay不应该在这里适用,我不会想到,但拥有它并没有什么坏处。
支持ViewModel应该实现INotifyPropertyChanged,以便通知UI该属性已更改。 EndDateEnabled属性的代码可能最终看起来像:
private bool endDateEnabled = false;
public bool EndDateEnabled
{
get { return endDateEnabled; }
set
{
if (endDateEnabled != value)
{
endDateEnabled = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("EndDateEnabled"));
}
}
}
我是从记忆中做到的,所以它可能不完美,但这是一般的想法。