0

预期行为

  1. 有组合框和日期选择器。
  2. 在选择更改组合框时,应启用或禁用日期选择器,具体取决于组合框选择。

我如何尝试实施

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

我无法实现该功能。请指教。

4

2 回答 2

5

您不需要该[0]部分(它是布尔值,而不是集合),并且绑定不需要是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")在这种情况下,您需要调用DateModeValuesetter,以便刷新绑定。

于 2012-08-30T18:32:48.227 回答
0

我看到了两个问题。首先,您与 EndDateEnabled 的绑定应该更像:

IsEnabled="{Binding Path=EndDateEnabled}"

[0] 无效或不必要,因为绑定的目标只是一个计划 bool 属性。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"));
        }
    }
}

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

于 2012-08-30T18:36:54.367 回答