gpt4 book ai didi

c# - 如何将UpdateSourceTrigger的值交给UserControl或者运行时更新?

转载 作者:太空狗 更新时间:2023-10-29 23:19:52 24 4
gpt4 key购买 nike

我遇到了 UpdateSourceTrigger 属性的问题。我有一个名为 LabelWithTextBox 的用户控件,其中未定义 UpdateSourceTrigger(在文本属性上)(因此具有默认值)。由于性能原因,这应该保持这种状态(当焦点离开 TextBox 时,文本应该更新)。

但现在我有一个情况应该使用 UserControl 并且更新应该在用户键入时发生,因此我想将 UpdateSourceTrigger 设置为 PropertyChanged。

理想情况下,最好的解决方案是可以继承 UpdateSourceTrigger 属性。用户在他的 View 中使用 UserControl 并定义 UpdateSourceTrigger = PropertyChanged,此信息被移交给我的 UserControl,一切都按预期进行。有谁知道我该如何存档?

我还有哪些其他选择?如何在运行时更改 UpdateSourceTrigger 属性?

这是相关的用户控件(代码隐藏)代码:

public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
"Text",
typeof(string),
typeof(LabelWithTextBox),
new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

public string Text
{
get { return (string)this.GetValue(TextProperty); }
set { this.SetValue(TextProperty, value); }
}

这是 UserControl (Xaml) 代码:

<Grid Grid.Column="1">
<telerik:RadWatermarkTextBox TextChanged="TextBoxBase_OnTextChanged"
Name="TextBox"
Text="{Binding Text, Mode=TwoWay, ElementName=userControl}"
WatermarkContent="{Binding Placeholder, Mode=TwoWay, ElementName=userControl}"
TextWrapping="{Binding TextWrap, Mode=TwoWay, ElementName=userControl}"
AcceptsReturn="{Binding AcceptsReturn, Mode=TwoWay, ElementName=userControl}"
VerticalScrollBarVisibility="{Binding VerticalScrollBarVisibility, Mode=TwoWay, ElementName=userControl}"
MinLines="{Binding MinLines, Mode=TwoWay, ElementName=userControl}"
MaxLines="{Binding MaxLines, Mode=TwoWay, ElementName=userControl}"
IsReadOnly="{Binding IsReadOnly, ElementName=userControl}"/>
....

如果将 UpdateSourceTrigger = PropertyChanged 添加到 Text,一切都会按预期工作。但我不想这样。

例如,这里是某人如何在他的 View 中使用 UserControl。我正在寻找的是一种将 UpdateSourceTrigger 的值移交给我的 UserControl 的方法,但是如何?

<controls:LabelWithTextBox
Grid.Row="1"
Margin="0,5,0,0"
Label="Excel Blattname:"
SharedSizeGroup="LabelsX"
Text="{Binding SheetName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

最佳答案

UpdateSourceTrigger 是 Binding 的属性,而不是控件的属性。为了将其传递给控件,​​您可以将整个 Binding 传递给适当的属性。

您的控件可以公开一个 TextBinding 属性:

public partial class LabelWithTextBox : UserControl
{
public LabelWithTextBox()
{
InitializeComponent();
}

private BindingBase textBinding;

public BindingBase TextBinding
{
get { return textBinding; }
set
{
textBinding = value;
TextBox.SetBinding(RadWatermarkTextBox.TextProperty, textBinding);
}
}
}

您将为其分配一个绑定(bind)

<controls:LabelWithTextBox
TextBinding="{Binding SheetName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

然后直接传递给 RadWatermarkTextBox。

缺点当然是只能赋值Binding,不能赋值其他。


但是,您也可以使用 Text 依赖属性并在加载控件时检查其值。如果该值是一个绑定(bind),您可以像这样使用它:

public override void OnApplyTemplate()
{
base.OnApplyTemplate();

var binding = GetBindingExpression(TextProperty)?.ParentBinding;

if (binding != null)
{
TextBox.SetBinding(RadWatermarkTextBox.TextProperty, binding);
}
}

关于c# - 如何将UpdateSourceTrigger的值交给UserControl或者运行时更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55241368/

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