在静态类中定义的附加属性不起作用

时间:2010-12-11 13:13:01

标签: wpf binding

我在附加行为方面遇到了一些问题。我想提供一个绑定到依赖属性,但是在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类中。我应该如何更改它的定义?

2 个答案:

答案 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,这是图表本身(在事件通过图表控件的图层冒泡之后)。