我坚持不懈地希望得到一个简单的答案。首先,我有一个具有多绑定触发器的主题。
<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事件不会强制数据触发要么,我宁愿找出趁现在还是想知道,所有的(脏话)挂钩这一点。网有,并且你基本上可以指向几乎任何东西。
答案 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()以及触发器...... 无论如何,只是一个想法!