【问题标题】:Can I use WPF DataTrigger for setting constant value to my DataContext object and TimePicker at the same time我可以使用 WPF DataTrigger 同时为我的 DataContext 对象和 TimePicker 设置常量值吗
【发布时间】:2013-11-20 18:19:12
【问题描述】:

我的屏幕上有两个 RadioButton 和一个 TimePicker 控件。对于 TimePicker,active_end_Date 是 DataContext 中的一个属性,其值是从 TimePicker 值属性设置的。 如果选中了两个 RadioButton 之一,我想将 TimePicker 的 Value 属性设置为 23:59:59,这反过来应该更新我的 DataContext 值。

<RadioButton Content="Occurs at once: " FontSize="18" GroupName="DailyFreqGroup" Name="DailyFreqGroupRadio1"/>
<xctk:TimePicker Name="EndTimeTextBoxDailyFreq"  Value="{Binding Path=active_end_date, Mode=TwoWay, Converter={StaticResource TimeConverter}
    , ConverterParameter='active_end_date'}" HorizontalAlignment="Left" Margin="2" MinWidth="100" Format="LongTime">
    <xctk:TimePicker.Style>
        <Style TargetType="{x:Type xctk:TimePicker}">
            <Setter Property="Value" Value="01-01-0001 PM 11:00:00"></Setter>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=IsChecked, ElementName=DailyFreqGroupRadio1}" Value="True">
                    <Setter Property="Value" Value="01-01-0001 PM 05:00:00">
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </xctk:TimePicker.Style>
</xctk:TimePicker>

我想,我需要分配某种转换器,但不知道该怎么做。

【问题讨论】:

  • 问题是什么?该解决方案不起作用吗?
  • 您的DataTrigger 正在用静态DateTime 字符串替换存储在TimePicker.Value 中的绑定。更好的解决方案是绑定DailyFreqGroupRadioIsChecked 属性,并且每当该属性在ViewModel 中发生变化时,更新active_end_date 属性
  • @devhedgehog:是的,这段代码不起作用。我期待在 TimePicker 中看到这个时间,但它没有被设置。
  • @Rachel:正在发生逆转。绑定正在替换 DataTrigger 设置的静态值。我通过从 TimePicker.Value 中删除 Binding 来确认它
  • @ShantanuGupta 根据Dependency Property Precedence List,在 XAML 中设置的本地值会覆盖通过样式触发器设置的任何设置。如果您将Value 属性设置为样式设置器中的绑定,则触发器将是最后一个应用的触发器。不过需要注意的是,您的触发器会更新 TimePicker.Value 属性,并且不会更新它所绑定的 active_end_date 属性。

标签: c# wpf data-binding wpftoolkit


【解决方案1】:

属性TimePicker.Value 一次只能设置一个值:指向active_end_date 的绑定或"01-01-0001 PM 05:00:00" 的静态日期时间字符串。在触发器中将其设置为字符串将无法更新绑定值,因为它会替换绑定而不是更新它。

您需要做的是将您的DailyFreqGroupRadio 复选框的IsChecked 属性绑定到您的DataContext 中的某个内容,并处理它的PropertyChanged 事件以将active_end_date 设置为您想要的值。

这实际上是更好的 MVVM 设计,因为您的 ViewModel 应该模拟您的 View,并且诸如选中某个框时属性的默认值之类的业务逻辑应该存在于 ViewModel 中,而不是在View.

例如,

<CheckBox IsChecked="{Binding daily_freq_checked}" ... />
<xctk:TimePicker Value="{Binding Path=active_end_date}" ... />

在你的代码中

void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "daily_freq_checked" && daily_freq_checked)
    {
        active_end_date = "01-01-0001 PM 05:00:00";
    }
}

还应该注意,您当前的 XAML 不会触发 DataTrigger,因为根据 Dependency Property Precedence List,在 XAML 中本地设置的值将优先于样式中的触发值,因此您的触发值永远不会被应用。

【讨论】:

    猜你喜欢
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 2015-08-03
    相关资源
    最近更新 更多