Dev*_*vid 5 c# wpf xaml user-controls telerik
我面临UpdateSourceTrigger属性的问题。我有一个名为LabelWithTextBox的UserControl,其中未定义UpdateSourceTrigger(文本属性)(因此具有默认值)。由于性能,它应该保持这样(当Focus不在TextBox中时,Text应该更新)。
但是现在我有一种情况,应该使用UserControl并根据用户类型进行更新,因此我想将UpdateSourceTrigger设置为PropertyChanged。
理想情况下,最好的解决方案是可以继承UpdateSourceTrigger属性。用户在其视图中使用UserControl并定义UpdateSourceTrigger = PropertyChanged,此信息将移交给我的UserControl,并且一切正常。有人知道我可以将其存档吗?
我还有什么其他选择?如何在运行时更改UpdateSourceTrigger属性?
这是相关的UserControl(隐藏代码)代码:
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); }
}
Run Code Online (Sandbox Code Playgroud)
这是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}"/>
....
Run Code Online (Sandbox Code Playgroud)
如果将UpdateSourceTrigger = PropertyChanged添加到Text,一切将按预期工作。但是我不想要那样。
例如,这是某人如何在其视图中使用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}" />
Run Code Online (Sandbox Code Playgroud)
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
您将为其分配一个绑定,例如
<controls:LabelWithTextBox
TextBinding="{Binding SheetName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
Run Code Online (Sandbox Code Playgroud)
然后直接传递到 RadWatermarkTextBox。
当然,缺点是你只能分配 Binding 而不能分配其他任何东西。
不过,您也可以使用Text依赖属性并在加载控件时检查其值。如果该值是 Binding,您可以像这样使用它:
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
var binding = GetBindingExpression(TextProperty)?.ParentBinding;
if (binding != null)
{
TextBox.SetBinding(RadWatermarkTextBox.TextProperty, binding);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |