我在附加行为方面遇到了一些问题。我想提供一个绑定到依赖属性,但是在ViewModel初始化之前,该值是未知的,因此Setter失败。
目前,我有这段代码:
<Style TargetType="{x:Type visi:Chart}">
<Setter Property="att:ChartBehaviour.ExecuteCommandOnDoubleClick" Value="true"/>
<Setter Property="att:ChartBehaviour.ShowHideCommand" Value="{Binding OverviewHideCommand}"/>
</Style>
第一个setter工作得非常好,但第二个没有,因为OverviewHideCommand
将不可用(即样式应用程序点为null
),直到后备对象是建造的。
有关如何解决此问题的任何指示?如果可能的话,我真的很想留在xaml。
修改
问题出现在ShowHideCommand
的定义中,它定义为附加属性(该类与xaml本身位于不同的名称空间,但xaml引用了名称空间):
public static class ChartBehaviour
{
public static readonly DependencyProperty ShowHideCommandProperty =
DependencyProperty.RegisterAttached("ShowHideCommand",
typeof(ICommand),
typeof(Chart),
new PropertyMetadata(new DefaultCommand()));
}
有趣的是,该属性未出现在Chart
类中。我应该如何更改它的定义?
答案 0 :(得分:1)
您可以使用恰当命名的Trigger类触发setter。触发器(和DataTrigger,其操作类似,但实现INotifyPropertyChanged的非依赖项属性)可用于监视特定值的属性,如果值更改为给定值,则可以执行一系列setter。
实现此目的的一种简单方法是使用监视“后备对象”属性的数据触发器,将其设置为非空值。发生这种情况时,您的安装人员将/应该被应用。
答案 1 :(得分:0)
我已经解决了这个问题。实际上,这是两个问题。
首先:为Chart
定义附加属性,而不是ChartBehaviour
。
之后,它正确解析并启动。然后第二个问题出现了 - 我指定了以下事件:
static void OnMouseDoubleClick(object sender, RoutedEventArgs e)
{
var obj = e.OriginalSource as Visifire.Charts.Chart;
if (obj == null)
return;
GetShowHideCommand(obj).Execute(null);
}
问题在于这一行:var obj = e.OriginalSource as Visifire.Charts.Chart;
。图表是一个非常复杂的对象,因此e.OriginalSource
将返回Border
元素(或其他内容,具体取决于您双击的位置)。正确的成员是Source
,这是图表本身(在事件通过图表控件的图层冒泡之后)。