首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MultiDataTrigger不遵守所有条件

MultiDataTrigger不遵守所有条件
EN

Stack Overflow用户
提问于 2020-07-24 18:06:29
回答 1查看 35关注 0票数 0

我创建了一个"On“"Off”开关,但我无法让MultiDataTrigger遵守所有条件。

代码语言:javascript
复制
<UserControl.Resources>
   <Style TargetType="Button" BasedOn="{StaticResource NoDevExpressStyle}">
      <Setter Property="Template">
         <Setter.Value>
            <ControlTemplate>
               <Border Height="30" Width="81" CornerRadius="15" BorderThickness="1" Background="White">
                  <Border.Style>
                     <Style TargetType="Border">
                        <Style.Triggers>

                           <!-- On Not Selected -->
                           <MultiDataTrigger>
                              <MultiDataTrigger.Conditions>
                                 <Condition Binding="{ Binding Path=State}" Value="{x:Static models:ExperimentState.On}" />
                                 <Condition Binding="{Binding SwitchClicked, RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}}" Value="False"></Condition>
                              </MultiDataTrigger.Conditions>
                              <Setter Property="BorderBrush" Value="{StaticResource OnInactiveColorBrush}"></Setter>
                           </MultiDataTrigger>

                           <!-- On Selected -->
                           <MultiDataTrigger>
                              <MultiDataTrigger.Conditions>
                                 <Condition Binding="{ Binding Path=State}" Value="{x:Static models:ExperimentState.On}" />
                                 <Condition Binding="{Binding SwitchClicked, RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}}" Value="True"></Condition>
                              </MultiDataTrigger.Conditions>

                              <Setter Property="BorderBrush" Value="{StaticResource OnColorBrush}"></Setter>

                           </MultiDataTrigger>

                           <!-- OFF Not Selected -->
                           <MultiDataTrigger>
                              <MultiDataTrigger.Conditions>
                                 <Condition Binding="{ Binding Path=State}" Value="{x:Static models:ExperimentState.Off}" />
                                 <Condition Binding="{Binding Path=SwitchClicked}" Value="False"></Condition>
                              </MultiDataTrigger.Conditions>
                              <Setter Property="BorderBrush" Value="{StaticResource OffInactiveColorBrush}"></Setter>
                           </MultiDataTrigger>

                           <!-- Off and selected -->
                           <MultiDataTrigger>
                              <MultiDataTrigger.Conditions>
                                 <Condition Binding="{ Binding Path=State}" Value="{x:Static models:ExperimentState.Off}" />
                                 <Condition Binding="{Binding Path=SwitchClicked}" Value="True"></Condition>
                              </MultiDataTrigger.Conditions>

                              <Setter Property="BorderBrush" Value="{StaticResource OffColorBrush}"></Setter>
                           </MultiDataTrigger>
                        </Style.Triggers>
                     </Style>
                  </Border.Style>
               </Border>
               <ControlTemplate.Triggers>
                  <Trigger Property="IsMouseOver" Value="True">
                     <Setter Property="Cursor" Value="Hand"></Setter>
                  </Trigger>
               </ControlTemplate.Triggers>
            </ControlTemplate>
         </Setter.Value>
      </Setter>
   </Style>
</UserControl.Resources>

<Button x:Name="Button" Click="ButtonBase_OnClick" />

它似乎尊重"State“属性,该属性是一个只设置一次且永远不会更改的依赖属性。但是,SwitchClicked不会考虑控件内部的属性。

代码语言:javascript
复制
private bool _switchClicked;
public bool SwitchClicked
{
   get => _switchClicked;
   set => _switchClicked = value;
}


private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
   if (Button.Command != null)
   {
      if (Button.Command.CanExecute(Button.CommandParameter))
      {
         SwitchClicked = !SwitchClicked;
         SetValue(IsActiveProperty, !IsActive);
         Button.Command.Execute(null);
      }
   }
}

有人能告诉我如何确保我的所有条件都得到满足吗?

我尝试过将可靠的源代码绑定到自身和用户控件,但是SwitchClicked属性在代码背后,并且没有ViewModel。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-24 18:25:31

你必须在你的视图模型(或者我猜是你的代码隐藏)中实现INotifyPropertyChanged,否则设置你的属性不会通知更改,触发器中的绑定也不会更新。

代码语言:javascript
复制
public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{
   PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
代码语言:javascript
复制
public bool SwitchClicked
{
   get => _switchClicked;
   set
   {
      if (_switchClicked != value)
      {
         _switchClicked = value;
         OnPropertyChanged(nameof(SwitchClicked));
      }
   }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63071412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档