【问题标题】:Limit attached dependency property in wpf限制 wpf 中的附加依赖属性
【发布时间】:2011-07-29 14:09:43
【问题描述】:

我只想将依赖属性附加到特定控件。

如果这只是一种类型,我可以这样做:

public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.RegisterAttached("MyProperty", typeof(object), typeof(ThisStaticWrapperClass));

public static object GetMyProperty(MyControl control)
{
    if (control == null) { throw new ArgumentNullException("control"); }

    return control.GetValue(MyPropertyProperty);
}

public static void SetMyProperty(MyControl control, object value)
{
    if (control == null) { throw new ArgumentNullException("control"); }

    control.SetValue(MyPropertyProperty, value);
}

(所以:在 Get/Set-Methods 中限制 Control 类型)

但现在我也想允许该属性附加到不同类型的 Control
您会尝试为具有该新类型的两种方法添加重载,但由于 “未知构建错误,发现不明确的匹配”而无法编译。

那么如何将我的DependencyProperty 限制为Controls 的选择?
(注意:在我的具体情况下,TextBoxComboBox 需要它)

【问题讨论】:

  • 澄清如果您有两种方法SetMyProperty(TextBox control, object value)SetMyProperty(ComboBox control, object value) 会出现错误?如果是这样,则可能是附加财产制度的限制。如果是这样,除了附加到最大的公共基类并在它附加到不受支持的控件类型时抛出异常之外,可能没有其他方法......
  • @Will - 是的,这就是我尝试的方法 =( 那太糟糕了,所以我必须先 "allow" 为所有Controls 使用它...

标签: c# .net wpf dependency-properties


【解决方案1】:

找到不明确的匹配项。

...如果有多个重载并且没有指定类型签名,则通常由GetMethod 抛出(MSDN:More than one method is found with the specified name.)。基本上,WPF 引擎只是在寻找一种这样的方法。

为什么不检查方法体中的类型,如果不允许就抛出InvalidOperationException


但是请注意,这些 CLR-Wrapper 不应在设置和获取之外包含任何代码,如果在 XAML 中设置了属性它们将被忽略,请尝试抛出setter 中的异常,如果只使用 XAML 设置值,则不会出现。

改用回调:

public static readonly DependencyProperty MyPropertyProperty =
    DependencyProperty.RegisterAttached
        (
            "MyProperty",
            typeof(object),
            typeof(ThisStaticWrapperClass),
            new UIPropertyMetadata(null, MyPropertyChanged) // <- This
        );

public static void MyPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
    if (o is TextBox == false && o is ComboBox == false)
    {
        throw new InvalidOperationException("This property may only be set on TextBoxes and ComboBoxes.");
    }
}

【讨论】:

  • 抛出异常是强制执行此操作的一种可能方式,但我会放弃编辑器自动完成支持(在 VS 中),因为在这种情况下它仍然会出现在每个控件中。
  • 确定在 XAML 中绑定时调用了 MyPropertyChanged? DP getter/setter(常规,未附加)被依赖属性系统绕过。如果附加的 DP 也是如此,那么每当他对附加属性进行操作时,他都需要投掷。
  • @Will:所有更改都会调用回调,无论是通过绑定、在 XAML 中设置还是调用 Set 方法。
  • 哦,好的,我已经在使用属性更改回调进行进一步操作。所以我现在试图过滤掉不需要的控件。
  • @ordag:这只是附加属性的限制之一,我认为您对此无能为力。 (如果您尝试将 TriggerAction&lt;T&gt; 附加到 T 以外的其他内容,Blend Interactivity 也会引发异常)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 2014-05-23
相关资源
最近更新 更多