我希望能够在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扩展或其他东西解决了这个问题。
答案 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中表达的标记扩展。