触发多路复用DataTrigger无法正常工作?

时间:2012-04-26 11:47:26

标签: wpf themes datatrigger

我坚持不懈地希望得到一个简单的答案。首先,我有一个具有多绑定触发器的主题。

<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 )

然后我可以类型强制转换为接口并检查所有的任何特殊条件我想,而不必显式地创建说..十几触发各自基于A + B或A + C或(A + B NOT c)或d等等。

所以,我不想拥有一堆不同的主题,一堆触发器等,只是一个集中的元素。我在寻找到其他的替代品,但如果我遇到了一个实例,只是抛出一个PropertyChanged事件不会强制数据触发要么,我宁愿找出趁现在还是想知道,所有的(脏话)挂钩这一点。网有,并且你基本上可以指向几乎任何东西。

1 个答案:

答案 0 :(得分: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:Button

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