我的自定义工具栏控件包含DependencyProperty IsBusy
以下是我如何使用它:
<Controls:myToolbar
Grid.ColumnSpan="5" Mode="DataEntry"
Status="{Binding State, Converter={StaticResource ViewEditingStateToToolbarStateConverter}}"
IsBusy="{Binding IsBusy}"/>
按照惯例,我的所有VM都从基本VM继承并具有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);
}
答案 0 :(得分:0)
如果您尝试将此控件与不具有IsBusy
属性的视图模型一起使用会很糟糕,但即使这样,您也会在输出窗口中收到调试警告,无需担心关于。
对于绑定的位置,如果绑定的依赖项属性不在其回调中执行任何操作,则构造函数是合适的。
但是如果属性改变了回调尝试调用GetTemplateChild
这样的函数并检索内部控件 - 那么你应该将绑定移动到OnApplyTemplate
函数,因为只有在那里你可以确保存在内部控件。 / p>
顺便说一下,如果您的依赖项proeprty没有属性更改回调并且仅在{TemplateBinding IsBusy}
等控件模板中使用,则可以用{Binding IsBusy}
替换此行。这样的事情,通过使用绑定或数据触发器:
<ControlTemplate TargetType="{x:Type Controls:myToolbar}">
<Grid>
<ContentControl x:Name="content" ... />
<ProgressBar x:name="progress" ... />
</Grid>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding IsBusy}" Value="True">
<Setter TargetName="progress" Property="Visibility" Value="Visible" />
</DataTrigger>
这个想法很简单:TemplateBinding
应用于控件的依赖属性,而Binding
应用于DataContext对象或视图模型的属性,它们可以共存而没有问题。