【问题标题】:DataTrigger to Update a DatePicker when a RadioButton IsCheckedDataTrigger 在 RadioButton IsChecked 时更新 DatePicker
【发布时间】:2019-12-16 15:15:35
【问题描述】:

我只是想根据单选按钮的 IsChecked 在 DatePicker 中设置 SelectedDate。当单选按钮 IsChecked 为 true 时,应在 DatePicker 中输入今天的日期。如果 IsChecked 为 false,则 DatePicker 应为空。我尝试了数据触发器的各种版本,但都没有产生任何好处。无论单选按钮是什么,DatePicker 中都不会填充任何内容。为了让它正常工作,我缺少什么?

<DatePicker Grid.Row="19" Grid.Column="1" Width="120" SelectedDate="{Binding SelectedApplication.DateHireDeclineSent}"
            Visibility="{Binding IsChecked, ElementName=HireDeclinedYes, Converter={StaticResource BooleanToVisibilityConverter}}" >
    <DatePicker.Style>
        <Style TargetType="DatePicker">                                    
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=HireDeclinedYes, Path=IsChecked, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Value="True">
                    <Setter Property="SelectedDate" Value="{x:Static sys:DateTime.Now}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=HireDeclinedYes, Path=IsChecked}" Value="False">
                    <Setter Property="SelectedDate" Value="{x:Null}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DatePicker.Style>
</DatePicker>

<StackPanel Grid.Row="16" Grid.Column="4" Orientation="Horizontal"
            Visibility="{Binding IsChecked,ElementName=NoHireAdd, Converter={StaticResource BooleanToVisibilityConverter}}">
    <RadioButton x:Name="HireDeclinedYes" Content="Yes" IsChecked="{Binding SelectedApplication.HireDeclined}" />
    <RadioButton x:Name="HireDeclinedNo" Margin="5,0,0,0" Content="No" IsChecked="{Binding SelectedApplication.HireDeclined, Converter={StaticResource BoolInverterConverter}}" />
</StackPanel>

【问题讨论】:

    标签: c# wpf datatrigger


    【解决方案1】:

    如果您删除 SelectedDate="{Binding SelectedApplication.DateHireDeclineSent}" 并使用 setter 设置默认值,它应该可以工作:

    <DatePicker Grid.Row="19" Grid.Column="1" Width="120"
                Visibility="{Binding IsChecked, ElementName=HireDeclinedYes, Converter={StaticResource BooleanToVisibilityConverter}}" >
        <DatePicker.Style>
            <Style TargetType="DatePicker">
                <Setter Property="SelectedDate" Value="{Binding SelectedApplication.DateHireDeclineSent}" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=HireDeclinedYes, Path=IsChecked, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Value="True">
                        <Setter Property="SelectedDate" Value="{x:Static sys:DateTime.Now}"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=HireDeclinedYes, Path=IsChecked}" Value="False">
                        <Setter Property="SelectedDate" Value="{x:Null}"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </DatePicker.Style>
    </DatePicker>
    

    本地值优先于样式设置器:https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/dependency-property-value-precedence

    【讨论】:

    • 太棒了!感谢@mm8 成功了!我也学到了一些东西。
    【解决方案2】:

    由于 DatePicker SelectedDate 绑定到 SelectedApplication.DateHireDeclineSent 并且单选按钮 IsChecked 属性绑定到 SelectedApplication.HireDeclined ,您可以在 setter 的 SelectedApplication.HireDeclined 是否也更改 SelectedApplication.DateHireDeclineSent 属性并引发属性更改事件?

    这将更改 DatePicker 绑定的属性,并且属性更改事件将通知视图有关更改,从而更改 DatePicker SelectedDate。

    就像这样:

    private bool _hireDeclined;
    public bool HireDeclined
    {
        get => _hireDeclined;
        set 
        {
            _hireDeclined = value;
            NotifyPropertyChanged("HireDeclined");
            if (//some condition)
                DateHireDeclineSent = DateTime.Now;
        }
    }
    
    private DateTime _dateHireDeclineSent;
    public DateTime DateHireDeclineSent
    {
        get => _dateHireDeclineSent;
        set
        {
            _dateHireDeclineSent = value;
            NotifyPropertyChanged("DateHireDeclineSent");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-27
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 2011-06-16
      • 2012-10-23
      • 2012-04-12
      相关资源
      最近更新 更多