【问题标题】:How do I write a pseudo-write-only dependency property?如何编写伪只写依赖属性?
【发布时间】:2011-07-20 22:12:56
【问题描述】:

好的,这只是我脑海中浮现的关于一种“仅伪写”依赖属性的想法。我说 sort of 是因为我实际上什至不希望存储该值,而是希望将传递给 setter 的值设置为 other 属性。作为一个假设的例子,我想这样做......

<button UIHelper.Bounds="10,10,40,20" />

而不是这个...

<button Canvas.Left="10" Canvas.Top="10" Width="40" Height="20" />

只是一个 XAML 键入方便的东西,它让我可以设置实际的四个属性,这要归功于一个只写附加属性。想想折叠的 CSS 规则。实际上,为此,还有另一个……

<border UIHelper.BrushSpec="AliceBlue Red 2 4" />

而不是...

<border Background="AliceBlue" BorderBrush="Red" BorderThickness="2" CornerRadius="4" />

现在以第一个为例,一个想法是在内部存储这样的结构,然后将其与现有的 Width、Height、Canvas.Left 和 Canvas.Top 属性同步,但我真的不打算阅读它退出,所以不需要。 (从技术上讲,我可以完全忽略它的存储,而只是在 propertychanged 处理程序中调用 ClearValue,但同样,它并不是真正用于将其读回,所以这只是为了保持一致性。)

从技术上讲,我什至不希望/不需要这是一个 DP,除了我的理解是,如果您需要从 XAML 设置它,它必须是一个 DP,因此我所追求的。如果我们可以设置一个直接的 .NET 属性,那将是完美的,因为我可以设置实现,并根据需要重新构建自己,但是我知道您不能从 XAML 访问 .NET 属性,因此我我回到这里。

现在是的,我知道这个概念会受到很多人的反对,尤其是 XAML 纯粹主义者,但我问的是 如何 而不是 为什么 所以如果没有其他原因,将其视为“可以完成”而不是“应该完成”的练习。我什至不建议这是我将使用的。我只是想更好地理解 DP 和 XAML 的限制,我发现这样的练习真的很有帮助。

那么,想法??

M

【问题讨论】:

    标签: wpf xaml dependency-properties writeonly


    【解决方案1】:

    在不编写自己的 XAML 编译器的极端情况下,我认为您能做的最好的事情是附加属性,该属性根据您定义的一些紧凑语法设置您感兴趣的属性组。是的,这意味着您已经为紧凑表示分配了存储空间,但正如您所说,您可以在应用后立即清除它。这可能有点不正统,但从技术上讲是可行的。

    您也可以尝试根本不声明附加属性字段,以便通过 get/set 方法访问该值(尚未尝试过,但我相信它在 DP 为私有时有效,所以也许这会有效)。这样,您实际上也可以让它可读,而不必费心监听相关属性的变化。当然,这意味着您的财产不会有变更通知:

    public static string GetBounds(UIElement uiElement)
    {
        return Canvas.GetLeft(uiElement) + "," + ...;
    }
    
    public static void SetBounds(UIElement uiElement, string compact)
    {
        // parse and apply compact
    }
    

    我只是将紧凑的表示放在上面的string 中,但您可能想要使用特定的类型。同样,上述方法可能不起作用 - 您可能需要关联的 DependencyProperty 实例。如果我在 Windows 机器上,我会尝试一下。

    【讨论】:

    • 是的,我很确定您的后一条评论由于我上面所述的原因不起作用...您无法从 XAML 访问非 DP 属性。实际上,他们 (MS) 特别警告不要将任何代码放在 .NET 属性 getter 或 setter 中,因为它们在通过其 XAML 对应物访问时会被完全绕过。至于你的第一部分,这正是我上面描述的。
    猜你喜欢
    • 1970-01-01
    • 2011-06-23
    • 2010-11-10
    • 1970-01-01
    • 2012-01-04
    • 2011-01-17
    • 2016-04-28
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多