gpt4 book ai didi

c# - 如何自动在自定义控件内创建绑定(bind)?

转载 作者:行者123 更新时间:2023-11-30 18:40:05 26 4
gpt4 key购买 nike

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

下面是我的使用方法:

<Controls:myToolbar 
Grid.ColumnSpan="5" Mode="DataEntry"
Status="{Binding State, Converter={StaticResource ViewEditingStateToToolbarStateConverter}}"
IsBusy="{Binding IsBusy}"/>

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

现在我有另外 4 个这样的属性。我不想在所有 View 中将它们添加到 XAML,而是想知道如何在控件代码中自动绑定(bind)到此 IsBusy,这样我就不必在 XAML 中绑定(bind)了?

编辑

实际上,我找到了问题的答案:Silverlight: Programmatically binding control properties

现在,我的问题是:

像这样在构造函数中应用此绑定(bind)是否正确?

public myToolbar()
{
this.DefaultStyleKey = typeof(myToolbar);

var binding = new Binding("IsBusy") { Mode = BindingMode.TwoWay };
this.SetBinding(IsBusyProperty, binding);
}

我是否应该检查此属性是否存在 XAML 绑定(bind)(另一个绑定(bind))而不是绑定(bind)?这两种方式都有效,但我想知道它是否对性能、气味等不利?

如何在 onApplyTemplate 中执行此操作。那是更好的方法吗?

if (GetBindingExpression(IsBusyProperty) == null)
{
var binding = new Binding("IsBusy") { Mode = BindingMode.TwoWay };
this.SetBinding(IsBusyProperty, binding);
}

最佳答案

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

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

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

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

关于c# - 如何自动在自定义控件内创建绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8854034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com