是否存在在XAML中使用任意C#表达式的现有方法?

时间:2010-12-03 13:51:12

标签: c# wpf xaml

我希望能够在XAML中使用任意C#表达式。通常,这将是基于两个绑定值计算UI元素的属性。

例如,根据其他两个属性计算UI元素的宽度。

这是我希望XAML看起来像一个人为的例子:

<TextBox
   x:Name="textBox1"
   />

<TextBox
   x:Name="textBox2"
   />

<Rectangle
    Height={Double.Parse(textBox1.Text) + Double.Parse(textBox2.Text)}
    />

当然,在XAML中没有内置的方法。

我知道我可以使用MultiBinding结合自定义转换器,这通常是我做这种事情的方式。然而,在我看来,在XAML中包含一些C#代码会简单得多,我想知道是否有人已经用XAML扩展或其他东西解决了这个问题。

5 个答案:

答案 0 :(得分:2)

您将C#代码嵌入到XAML中,如下所示:

 <x:Code>
            <![CDATA[

            void ButtonOnClick(object sender, RoutedEventArgs args)
            {
                Button btn = sender as Button;
                MessageBox.Show("The button labeled '" +
                                btn.Content +
                                "' has been clicked.","Information Message");
            }
            ]]>
  </x:Code>

但是根本不推荐这种方法,因为它将纯表示层与业务逻辑混合在一起。

答案 1 :(得分:2)

我见过自定义Xaml转换器,它采用IronPython代码并调用DLR。它不是C#,但它肯定不如使用[CDATA]标签的方法那么难看。

http://pybinding.codeplex.com/

这是关于此问题的开源项目的链接。

答案 2 :(得分:1)

请注意使用

之类的代码
Height={Double.Parse(textBox1.Text) + Double.Parse(textBox2.Text)}

特别困难(尽管并非完全不可能,保持Linq表达式),只要一些操作数发生变化,就可以重新评估价值。源更改时自动更新目标值是WPF绑定的主要优点之一。

答案 3 :(得分:1)

将表达式包装到公共属性中并绑定到该属性。

在C#代码隐藏中:

public double Heigth
{
  get { return Double.Parse(textBox1.Text) + Double.Parse(textBox2.Text); }
}

在XAML中:

<Rectangle Height={Binding Heigth} />

答案 4 :(得分:0)

我现在回答了我的问题。这不是我最初想要的答案,它有点长,但确实有效。

我正在读Josh Smith的这篇文章。他建议不要使用值转换器,而是将计算推送到视图模型中并将其作为属性公开:

http://groups.google.com/group/wpf-disciples/browse_thread/thread/3fe270cd107f184f?pli=1

在我的情况下,'textBox1'和'textBox2'的文本应绑定到视图模型中,因此当它们在视图模型中更改时,我知道它有时间进行计算并更新依赖属性。依赖属性然后触发其属性更改事件,并从中更新UI。

如果您希望使表达式依赖于只读控件属性,而您无法轻松绑定到视图模型,则可以按照此处提供的建议进行操作:

Pushing read-only GUI properties back into ViewModel

我仍然希望能够在XAML中嵌入(非业务逻辑)表达式。但看到这不是内置的任何方式,这可能是一个黑客攻击。通过视图模型似乎是这样做的正确方法,但也许有一天我会尝试编写允许在XAML中表达的标记扩展。