Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 能否强制XAML中指定的绑定传递自身(即绑定对象),而不是它的计算结果?_C#_Wpf_Xaml_Data Binding_Binding - Fatal编程技术网

C# 能否强制XAML中指定的绑定传递自身(即绑定对象),而不是它的计算结果?

C# 能否强制XAML中指定的绑定传递自身(即绑定对象),而不是它的计算结果?,c#,wpf,xaml,data-binding,binding,C#,Wpf,Xaml,Data Binding,Binding,我们正在尝试创建一个属性,当在XAML中设置时,该属性可以采用直接值或绑定对象。注意,我们希望存储绑定对象,而不是它的计算结果 对于后一种情况,如果属性的类型为Binding,则此方法有效,但如果属性的类型为object,则此方法无效,这是前一种情况下获取直接值所必需的 我想知道是否有任何方法可以修饰属性,比如说“如果有人通过XAML对您设置绑定,请存储binding对象本身,而不是它的计算结果!”本质上,它做的是与绑定类型相同的事情,但仍然允许它接收其他值 下面是一个演练,以澄清我们正在尝试做

我们正在尝试创建一个属性,当在XAML中设置时,该属性可以采用直接值或
绑定
对象。注意,我们希望存储
绑定
对象,而不是它的计算结果

对于后一种情况,如果属性的类型为
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; }
}