【发布时间】:2012-02-09 20:39:41
【问题描述】:
我的自定义工具栏控件带有 DependencyProperty IsBusy
这是我的使用方法:
<Controls:myToolbar
Grid.ColumnSpan="5" Mode="DataEntry"
Status="{Binding State, Converter={StaticResource ViewEditingStateToToolbarStateConverter}}"
IsBusy="{Binding IsBusy}"/>
按照惯例,我的所有虚拟机都继承自基础虚拟机并具有 IsBusy 属性。 所以,我知道这个属性在 VM 上总是可用的。
现在我还有另外 4 个这样的属性。我不想在我的所有视图上将它们添加到 XAML,我想知道如何在控件的代码中自动绑定到这个 IsBusy,这样我就不必在 XAML 中绑定?
编辑
实际上,我找到了我的问题的答案:Silverlight: Programmatically binding control properties
现在,我的问题是:
这样在构造函数中应用这个绑定是否正确?
public myToolbar()
{
this.DefaultStyleKey = typeof(myToolbar);
var binding = new Binding("IsBusy") { Mode = BindingMode.TwoWay };
this.SetBinding(IsBusyProperty, binding);
}
我是否应该检查此属性是否存在 XAML 绑定(另一个绑定)而不是绑定?无论哪种方式都可以,但我想知道它是否对性能、气味等有害?
在onApplyTemplate 中执行此操作怎么样。那是更好的方法吗?
if (GetBindingExpression(IsBusyProperty) == null)
{
var binding = new Binding("IsBusy") { Mode = BindingMode.TwoWay };
this.SetBinding(IsBusyProperty, binding);
}
【问题讨论】:
-
好点,我正在按照你的方式工作,我什至从未想过自动绑定它;-)
-
顺便说一句,我想您应该创建自己的“根网格”来包含所有具有这些绑定的控件的子项,不是吗??
-
不确定你的意思。我确实有自动检测父网格的内部属性。我检查名称“LayoutRoot”,如果没有 - 只需检查任何父网格。否则抛出异常,以便您在设计时也能看到它。
标签: c# silverlight xaml binding custom-controls