禁用CheckBox条件

时间:2016-06-17 10:34:57

标签: c# wpf xaml checkbox binding

我有CheckBox和两个TimePicker控件。我希望在TimePicker2-TimePicker1>的差异时启用复选框。 0.否则禁用它。

我可以在XAML中制作吗?

这里是代码:

<xctk:TimePicker Grid.Row="1" Grid.Column="0" Height="22" HorizontalAlignment="Stretch"
                                 Format="ShortTime" Margin="8,0,0,0"
                                 Value="{Binding ViewModel.StartTime,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                                 ></xctk:TimePicker>

<xctk:TimePicker Grid.Row="3" Grid.Column="0" Height="22" HorizontalAlignment="Stretch"
                                 Format="ShortTime"  Margin="8,0,0,0"
                                 Value="{Binding ViewModel.EndTime,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                                 ></xctk:TimePicker>
<CheckBox Grid.Row="4"
                      HorizontalAlignment="Left" VerticalAlignment="Center"
                      Margin="8,0,0,0" 
                     ??? IsEnabled="{Binding ElementName=}"
                      IsChecked="{Binding ViewModel.Date,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                      />

1 个答案:

答案 0 :(得分:2)

在ViewModel中,创建一个仅以getter为单位的属性,该属性以与UI无关的方式表示日期的有效性。像bool AreTimesValid一样。在此属性的getter中,评估开始时间和结束时间之间的差异,并相应地返回truefalse

每次AreTimesValidStartTime属性更改时,都会为EndTime属性提升属性更改通知。

class YourViewModel : INotifyPropertyChanged
{
    public bool AreTimesValid
    {
        get
        {
            return StartTime < EndTime;
        }
    }

    public DateTime StartTime
    {
        get
        {
            return startTime;
        }

        set
        {
            startTime = value;
            NotifyPropertyChanged("StartTime");
            NotifyPropertyChanged("AreTimesValid");
        }
    }

    private DateTime startTime;

    public DateTime EndTime
    {
        get
        {
            return endTime;
        }

        set
        {
            endTime = value;
            NotifyPropertyChanged("EndTime");
            NotifyPropertyChanged("AreTimesValid");
        }
    }

    private DateTime startTime;
}

CheckBox IsEnabled媒体资源绑定到AreTimesValid字段。

<CheckBox Grid.Row="4"
    HorizontalAlignment="Left" VerticalAlignment="Center"
    Margin="8,0,0,0" 
    IsEnabled="{Binding ElementName=ViewModel.AreTimesValid}"/>

另一种方法是使用实​​现IMultiValueConverter的转换器,并将比较逻辑放在那里。然后你可以直接绑定。但在我看来,第一种解决方案更简单,更清晰。