1

我被困在某事上,希望得到一个简单的答案。首先,我有一个具有多重绑定触发器的主题。

<DataTrigger Value="True">
  <DataTrigger.Binding>
    <MultiBinding Converter="{StaticResource MyConverter}" >
      <Binding Path=".TemplatedParent" RelativeSource="{RelativeSource Self}" />
      <Binding Path="IsEnabled" RelativeSource="{RelativeSource Self}" />
    </MultiBinding>
  </DataTrigger.Binding>
  <Setter Property="Background" Value="{StaticResource NewBackgroundColor}" />
  <Setter Property="BorderBrush" Value="{StaticResource NewBorderBrushColor}" />
</DataTrigger>

我的数据控件文本框、组合框实现了 INotifyPropertyChanged。

在处理过程中,在某些条件下,我想引发“IsEnabled”发生变化的事件,但实际上并没有改变它的值。因此,多重绑定永远不会被触发。由于转换器的第一个参数是控制对象本身,它永远不会“改变”,所以它只是作为转换器的参数来使用。

实际触发触发器的唯一方法是执行类似的操作

MyControl.IsEnabled = false;
MyControl.IsEnabled = true;

还有其他方法可以强制触发多绑定数据触发器吗?

尝试详细说明我的问题。我对基本控件(文本框、组合框、按钮等)进行了子类化,以添加某些设置/功能等。为了它们的共性,它们都支持“IMyCommonInterface”接口。无需重新定义整个“主题”(例如,简单的文本框),我想像进行数据验证一样有条件地更改颜色,但不仅仅是这些示例属性的简单颜色更改。

由于基本文本框不知道“IMyCommonInterface”,也没有自定义属性,因此我创建了一个转换器类“MyConverter”,它将实际控件对象作为第一个参数。现在,在隐蔽器中,我可以做到

if( values[0] is IMyCommonInterface )

然后,我可以对界面进行类型转换并检查所有我想要的任何特殊条件,而不必显式创建say.. 十几个触发器,每个触发器基于 A+B 或 A+C 或 (A+B NOT C) OR D 等。

所以,我不想有一堆不同的主题、一堆触发器等等,只是一个可以使用的集中元素。我正在寻找其他替代方案,但如果我遇到一个实例,即仅抛出 PropertyChanged 事件也不会强制数据触发,我宁愿现在找出来,同时仍然试图理解 .网络有,你基本上可以指向几乎任何东西。

4

1 回答 1

1

这只是一个想法...

由于您已经对基本控件进行了子类化。为什么不添加另一个属性。您可以添加一个 bool DependencyProperty(我们称之为“IsTriggered”)以及切换该属性的方法

public void ReEvaluateTrigger()
{
    IsTriggered = !IsTriggered;
}

public static readonly DependencyProperty IsTriggeredProperty =
        DependencyProperty.Register("IsTriggered", typeof(bool), typeof(ButtonEx), new FrameworkPropertyMetadata(false));

public bool IsTriggered
{
    get { return (bool)GetValue(IsTriggeredProperty); }
    set { SetValue(IsTriggeredProperty, value); }
}

然后在必要的时候,无论您的情况如何,您在代码中所要做的就是调用 myControl。

MyControl.ReEvaluateTrigger()

这应该导致触发器重新评估:

 ...taken from your code with a change to binding to IsTriggered
 <Binding Path="IsTriggered" RelativeSource="{RelativeSource Self}" />

我把它放在我的快速测试中,只是为了看看 IsEnabled 是否会切换(我知道这很简单,但这只是一个快速测试):

<Button Content="push to trigger enabled below" Click="Button_Click"/>
<Sample:ButtonEx x:Name="ButtonToBeTriggered"  IsEnabled="{Binding Path=IsTriggered, RelativeSource={RelativeSource Self}}"
            Content="ButtonToBeTriggered" Width="100" Height="50" Margin="50"/>

//where in code behind
private void Button_Click(object sender, RoutedEventArgs e)
    {
        ButtonToBeTriggered.ReEvaluateTrigger();
    }

在测试中,我扩展了

公共类 ButtonEx : 按钮

我在那里创建了 ReEvaluateTrigger() 以及触发器......无论如何,只是一个想法!

于 2012-04-26T21:56:09.200 回答