【问题标题】:How to create binding inside custom control automatically?如何在自定义控件中自动创建绑定?
【发布时间】: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


【解决方案1】:

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

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

顺便说一句,如果你的依赖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 对象或视图模型的属性,它们可以毫无问题地共存。

【讨论】:

  • 你在读我的想法 :) stackoverflow.com/questions/8855709/… 我“有点”通过在设置特定模式时添加绑定来修复它(这告诉我谁在使用控件)但仍然......感谢您解释绑定 vs模板绑定!我现在不能使用它,但在其他情况下它肯定会有用
猜你喜欢
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多