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

时间:2012-01-13 16:41:14

标签: c# silverlight xaml binding custom-controls

我的自定义工具栏控件包含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);
            }

1 个答案:

答案 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对象或视图模型的属性,它们可以共存而没有问题。