2

我们正在尝试创建一个在 XAML 中设置时可以采用直接值或Binding对象的属性。请注意,我们要存储Binding object,而不是它的评估结果。

对于后一种情况,如果属性是 type ,则此方法有效,Binding但如果它是type 则无效object,这是前一种情况下采用直接值所必需的。

我想知道是否有任何方法可以装饰属性以说“如果有人通过 XAML 对您设置绑定,请存储Binding对象本身,而不是它的评估结果!” 本质上做的事情就像它是类型一样,Binding但仍然允许它接收其他值。

这是一个演练,以阐明我们正在尝试做的事情。如你所知,你可以拥有这个...

public class MyClass
{
    public object Content{ get; set; }
}

然后使用 XAML,您可以创建它的一个实例并像这样设置它的 MyValue 属性......

<local:MyClass Content="Hello World" />

这工作正常并将字符串存储在属性中,但如果你尝试这个......

<local:MyClass Content="{Binding SomePath}" />

...它失败了,因为 MyClass 不是一个 DependencyObject 所以它不能设置绑定,这不是我们想要的。但是,如果您将属性定义更改为此...

public class MyClass
{
    public Binding Content{ get; set; }
}

现在可以了!它没有尝试评估绑定,而是将Binding 对象本身传递给属性设置器。换句话说,您不是在附加绑定,而是在存储一个Binding对象。

由于我们现在有了这个Binding对象,我们可以稍后在构建实际 UI 时通过附加它来使用它。这就是我们想要的。

将类型更改Binding为现在的问题是您将属性设置为“Hello World”的原始 XAML 失败,因为它无法从该字符串创建绑定!

这给我们留下了使用两个属性的不稳定解决方案......一个用于非绑定,一个用于绑定......

public class MyClass
{
    public object Content{ get; set; }
    public Binding ContentBinding{ get; set; }
}

...这行得通,但是现在我们真的只想要两个属性。毕竟,当绑定到 a 的 Text 属性时TextBox,您没有设置“TextBinding”!你刚刚设置Text!这就是我们要匹配的模型。

问题是 XAML 解析器似乎检查了正在设置的属性的类型,如果它不是Binding(即使它的object),它会尝试立即评估它。但是,如果类型是Binding,它只是简单地传递它。

简而言之,我们总是希望它作为 Binding 对象传递。我们从不希望它被评估。

是否有一些标记我们可以应用到我们的财产上说“从不评估”,或者我们可以做些什么吗?

4

0 回答 0