【问题标题】:datatrigger cannot set bound propertydatatrigger 无法设置绑定属性
【发布时间】:2014-04-08 09:04:19
【问题描述】:

我有 2 个复选框(chkMfsUi 和 chkMfs)。当我检查 chkMfsUi 时,我也想检查 chkMfs(并禁用它)。

我用数据触发器试了一下:

        <Style x:Key="MfsCheckBoxStyle" TargetType="CheckBox">
            <Setter Property="IsEnabled" Value="True" />
            <Setter Property="IsChecked" Value="False" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsChecked, ElementName=chkMfsUi}" Value="True">
                    <Setter Property="IsEnabled" Value="False" />
                    <Setter Property="IsChecked" Value="True" />
                </DataTrigger>
            </Style.Triggers>
        </Style>

这些是我的复选框:

<StackPanel>
    <CheckBox Name="chkMfsUi"
                Checked="CheckBox_Checked"
                Content="MFS - UI"
                IsChecked="{Binding MfsUi}"
                Unchecked="CheckBox_Checked" />
    <CheckBox Content="MFS" IsChecked="{Binding Mfs}" Style="{StaticResource MfsCheckBoxStyle}" />
</StackPanel>

IsEnabled 属性可以正常工作,但 IsChecked 不能。也许是因为它是绑定的?我也在使用 INotifyPropertyChanged 和这些属性。

如果我在后面的代码中设置它,它可以工作,但是可以使用触发器吗?

问候,

阿方

编辑:

从目前的答案看来,我的问题似乎不完整。我需要有以下三种状态:

最后但同样重要的是:必须绑定两个复选框的 IsChecked 属性! (这就是麻烦出现的时刻)

【问题讨论】:

    标签: wpf xaml binding triggers


    【解决方案1】:

    试试这个

      <StackPanel Grid.Column="1">
            <CheckBox x:Name="chkMfsUi" IsChecked="True"></CheckBox>
            <CheckBox x:Name="chkMfs" IsChecked="{Binding ElementName=chkMfsUi,Path=IsChecked}">
                <CheckBox.Style>
                    <Style TargetType="CheckBox">
                        <Style.Triggers>
                            <Trigger Property="IsChecked" Value="True">
                                <Setter Property="IsEnabled" Value="False"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </CheckBox.Style>
            </CheckBox>
    

    另一种方法:在资源中使用样式

    首先添加这个命名空间 xmlns:Globalvaribale="clr-namespace:System;assembly=mscorlib"

    <Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
        xmlns:Globalvaribale="clr-namespace:System;assembly=mscorlib">
    
    <Window.Resources>
        <Globalvaribale:String x:Key="chkMfsUi">chkMfsUi</Globalvaribale:String>
        <Style x:Key="chkMfsstyle" TargetType="CheckBox">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsChecked,ElementName={StaticResource chkMfsUi}}" Value="True">
                    <Setter Property="IsEnabled" Value="False"/>
                    <Setter Property="IsChecked" Value="True"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    
    <StackPanel Grid.Column="1">
        <CheckBox x:Name="chkMfsUi"></CheckBox>
        <CheckBox Style="{StaticResource chkMfsstyle}"/>
    </StackPanel>
    

    输出

    【讨论】:

    • 感谢您的回答 Heena,当我单击第二个复选框时,您的第一种方法的反应不是我想要的,但是您的第二种方法可以!所以你的第二种方法是正确的答案!谢谢。
    • @ffonz 不客气。你检查过第二种方法(使用样式)。第二种方法可能适用于你的情况。
    • 嗨,Heena,对不起。我的反应太快了。我注意到你的答案太简单了。两个复选框 IsChecked 属性均未绑定!这就是麻烦出现的时候......
    • @ffonz 没问题。但它应该绑定属性。
    【解决方案2】:

    在这种情况下,您可以使用EventTrigger

    表示一个触发器,它应用一组操作来响应事件。

    例子:

    <StackPanel>
        <StackPanel.Triggers>
            <EventTrigger RoutedEvent="CheckBox.Checked" SourceName="First">
                <BeginStoryboard>
                    <Storyboard>
                        <BooleanAnimationUsingKeyFrames Storyboard.TargetName="Second"
                                                        Storyboard.TargetProperty="IsChecked">
    
                            <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="True" />
                        </BooleanAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
    
            <EventTrigger RoutedEvent="CheckBox.Checked" SourceName="Second">
                <BeginStoryboard>
                    <Storyboard>
                        <BooleanAnimationUsingKeyFrames Storyboard.TargetName="First"
                                                        Storyboard.TargetProperty="IsChecked">
    
                            <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="True" />
                        </BooleanAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
    
            <EventTrigger RoutedEvent="CheckBox.Unchecked" SourceName="First">
                <BeginStoryboard>
                    <Storyboard>
                        <BooleanAnimationUsingKeyFrames Storyboard.TargetName="Second"
                                                        Storyboard.TargetProperty="IsChecked">
    
                            <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="False" />
                        </BooleanAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
    
            <EventTrigger RoutedEvent="CheckBox.Unchecked" SourceName="Second">
                <BeginStoryboard>
                    <Storyboard>
                        <BooleanAnimationUsingKeyFrames Storyboard.TargetName="First"
                                                        Storyboard.TargetProperty="IsChecked">
    
                            <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="False" />
                        </BooleanAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </StackPanel.Triggers>
    
        <CheckBox Name="First"
                  Content="First" />
    
        <CheckBox Name="Second" 
                  Content="Second" />
    </StackPanel>
    

    Storyboard 可以存储在 Resources 中以提高可读性,如下所示:

    <Window.Resources>
        <Storyboard x:Key="FirstCheckedStory" ... />            
    </Window.Resources>
    

    然后像这样使用:

    <EventTrigger RoutedEvent="CheckBox.Checked" SourceName="First">
        <BeginStoryboard Storyboard="{StaticResource FirstCheckedStory}" />
    </EventTrigger>
    

    另外,Storyboard 可以包含多个动作,只需将他按顺序排列即可:

    <Storyboard>
        <BooleanAnimationUsingKeyFrames ... />
        <BooleanAnimationUsingKeyFrames ... />
    </Storyboard>    
    

    【讨论】:

      猜你喜欢
      • 2013-06-25
      • 2013-06-18
      • 2023-04-07
      • 2013-12-14
      • 2013-09-05
      • 2016-10-28
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多