根据View Model中的属性将IsEnabled设置为true或false

时间:2012-08-30 18:27:38

标签: c# wpf xaml data-binding mvvm

预期行为

  1. 有ComboBox和DatePicker。
  2. 在组合框的选择已更改时,根据组合框选择,应启用或禁用DatePicker。
  3. 我如何尝试实施

    日期间隔和日期选择器的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);                
        }
    }
    

    我无法实现这项功能。 请指教。

2 个答案:

答案 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"));
        }
    }
}

我是从记忆中做到的,所以它可能不完美,但这是一般的想法。