C# 能否强制XAML中指定的绑定传递自身(即绑定对象),而不是它的计算结果?
我们正在尝试创建一个属性,当在XAML中设置时,该属性可以采用直接值或C# 能否强制XAML中指定的绑定传递自身(即绑定对象),而不是它的计算结果?,c#,wpf,xaml,data-binding,binding,C#,Wpf,Xaml,Data Binding,Binding,我们正在尝试创建一个属性,当在XAML中设置时,该属性可以采用直接值或绑定对象。注意,我们希望存储绑定对象,而不是它的计算结果 对于后一种情况,如果属性的类型为Binding,则此方法有效,但如果属性的类型为object,则此方法无效,这是前一种情况下获取直接值所必需的 我想知道是否有任何方法可以修饰属性,比如说“如果有人通过XAML对您设置绑定,请存储binding对象本身,而不是它的计算结果!”本质上,它做的是与绑定类型相同的事情,但仍然允许它接收其他值 下面是一个演练,以澄清我们正在尝试做
绑定
对象。注意,我们希望存储绑定
对象,而不是它的计算结果
对于后一种情况,如果属性的类型为Binding
,则此方法有效,但如果属性的类型为object
,则此方法无效,这是前一种情况下获取直接值所必需的
我想知道是否有任何方法可以修饰属性,比如说“如果有人通过XAML对您设置绑定,请存储binding
对象本身,而不是它的计算结果!”本质上,它做的是与绑定类型相同的事情,但仍然允许它接收其他值
下面是一个演练,以澄清我们正在尝试做什么。如你所知,你可以拥有这个
public class MyClass
{
public object Content{ get; set; }
}
然后使用XAML可以创建它的一个实例,并设置它的MyValue属性,如下所示
<local:MyClass Content="Hello World" />
它现在起作用了!它不尝试计算绑定,而是将绑定
对象本身传递给属性设置器。换句话说,您不是在附加绑定,而是在存储一个binding
对象
因为我们现在有了绑定
对象,所以我们可以在以后通过附加它来构建实际的UI时使用它。这就是我们想要的
将类型更改为Binding
的问题是,现在将属性设置为“Hello World”的原始XAML失败,因为它无法从该字符串创建绑定
这就给我们留下了使用两个属性的古怪解决方案。。。一个用于非绑定,一个用于绑定
public class MyClass
{
public object Content{ get; set; }
public Binding ContentBinding{ get; set; }
}
…这是可行的,但现在有两个属性,我们只需要一个。毕竟,当绑定到TextBox
的Text属性时,您没有设置“TextBinding”!您只需设置文本
!这就是我们想要匹配的模型
问题在于,XAML解析器似乎会检查正在设置的属性的类型,如果它不是绑定
(即使它的对象
),它也会立即尝试对其求值。但是,如果类型是Binding
,则它只传递它
简而言之,我们总是希望它作为绑定对象传递。我们从不想让它被评估
是否有一些标记可以应用于我们的属性以表示“从不求值”,或者我们可以做其他事情?我不确定在不更改XAML的情况下是否可以,因为我认为
绑定
是一种标记扩展。您可能可以编写自己的自定义标记表达式来返回绑定而不是值,但这仍然需要对XAML进行更改,因此它看起来像{local:MyBinding Text}
而不是{binding Text}
,这是人们最初的想法,但如上所示,当您设置的类型本身是Binding
时,情况并非如此。那它就不会评估了。它只是自己返回。也许GetValue的内部结构可以查看返回类型。不确定。我想我会深入反射器看看它在里面做什么。
public class MyClass
{
public Binding Content{ get; set; }
}
public class MyClass
{
public object Content{ get; set; }
public Binding ContentBinding{ get; set; }
}