如何自动在自定义控件内创建绑定?

我有自定义工具栏控件与DependencyProperty IsBusy

这是我如何使用它:

  

按照惯例,我的所有VM都inheritance自基本VM并具有IsBusy属性。 所以,我知道这个属性将始终在VM上可用。

现在我还有另外4个属性。 我想知道如何在控件的代码中自动绑定到这个IsBusy而不是在XAML中绑定XAML,而不是将它们添加到XAML中。

编辑

实际上,我找到了我的问题的答案: Silverlight:以编程方式绑定控件属性

现在,我的问题是:

在这样的构造函数中应用此绑定是否正确?

 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); } 

如果您尝试将此控件与不具有IsBusy属性的视图模型一起使用会很糟糕,但即使这样,您也只会在输出窗口中收到调试警告,无需担心。

至于绑定的位置,如果您绑定的依赖项属性不在其回调中执行任何操作,则构造函数是合适的。 但是,如果属性更改了回调尝试调用GetTemplateChild等函数并检索内部控件 – 那么您应该将绑定移动到OnApplyTemplate函数,因为只有在那里您可以确保存在内部控件。

顺便说一句,如果您的依赖项proeprty没有属性更改回调并且仅在{TemplateBinding IsBusy}等控件模板中使用,则可以通过{Binding IsBusy}替换此行。 这样的事情,通过使用绑定或数据触发器:

          

这个想法很简单: TemplateBinding应用于控件的依赖属性,而Binding应用于DataContext对象或视图模型的属性,它们可以共存而不会出现问题。