如何将UpdateSourceTrigger的值移交给UserControl或在运行时更新它?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将UpdateSourceTrigger的值移交给UserControl或在运行时更新它?相关的知识,希望对你有一定的参考价值。
我遇到了UpdateSourceTrigger属性的问题。我有一个名为LabelWithTextBox的UserControl,其中未定义UpdateSourceTrigger(On Text Property)(因此具有默认值)。由于性能原因,这应该保持这样(当Focus不在TextBox中时,Text应该更新)。
但是现在我有一个应该使用UserControl的情况,并且更新应该在用户输入时发生,因此我想将UpdateSourceTrigger设置为PropertyChanged。
理想情况下,最好的解决方案是如果可以继承UpdateSourceTrigger属性。用户在他的View中使用UserControl并定义UpdateSourceTrigger = PropertyChanged,这些信息被移交给我的UserControl,一切都按预期工作。有谁知道如何归档这个?
我还有其他选择吗?如何在运行时更改UpdateSourceTrigger属性?
这是相关的UserControl(Code Behind)代码:
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传递给适当的属性。
您的控件可能会暴露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);
}
}
}
你要指定一个Binding之类的
<controls:LabelWithTextBox
TextBinding="{Binding SheetName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
然后直接传递给RadWatermarkTextBox。
缺点当然是你只能分配Binding而不能分配其他内容。
但是,您也可以使用Text
依赖项属性,并在加载控件时检查其值。如果值是Binding,您可以像这样使用它:
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
var binding = GetBindingExpression(TextProperty)?.ParentBinding;
if (binding != null)
{
TextBox.SetBinding(RadWatermarkTextBox.TextProperty, binding);
}
}
对我来说,你想要达到什么目标还不够明确
您可以在代码中将绑定设置为RadWatermarkTextBox
,而不是在XAML中。
编辑:
现在我看到你想要的:)
将其添加到您的用户控件:
public bool UpdateOnPropChanged
{
get
{
return _updateOnPropChanged;
}
set
{
_updateOnPropChanged = value;
this.TextBox.SetBinding(TextBox.TextProperty, new Binding("Text") { RelativeSource=new RelativeSource(RelativeSourceMode.FindAncestor) { AncestorType=typeof(LabelWithTextBox) }, UpdateSourceTrigger = _updateOnPropChanged ? UpdateSourceTrigger.PropertyChanged : UpdateSourceTrigger.LostFocus });
}
}
private bool _updateOnPropChanged;
你可以使用它:
<controls:LabelWithTextBox UpdateOnPropChanged="false"/>
以上是关于如何将UpdateSourceTrigger的值移交给UserControl或在运行时更新它?的主要内容,如果未能解决你的问题,请参考以下文章
可以将UpdateSourceTrigger绑定到DependencyProperty吗?