如何在 UserControl 中使用 TwoWay 绑定? [英] How to use TwoWay binding from within a UserControl?
问题描述
我有自己的用户控件,一个 LabeledTextBox
,它是 Label
和一个..well,TextBox
的组合.此控件有两个属性:Caption
将绑定到 Label
的标题,以及 Value
将绑定到 TextBox
的文本.
I have my own UserControl, a LabeledTextBox
which is the combination of a Label
and a..well, TextBox
. This Control has two properties: Caption
which will be bound to the caption of the Label
, and Value
which will be bound to the Text
of the TextBox
.
代码:
public class LabeledTextBox : Control
{
static LabeledTextBox()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(LabeledTextBox), new FrameworkPropertyMetadata(typeof(LabeledTextBox)));
}
public string Caption
{
get { return (string)GetValue(CaptionProperty); }
set { SetValue(CaptionProperty, value); }
}
// Using a DependencyProperty as the backing store for Caption. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CaptionProperty =
DependencyProperty.Register("Caption", typeof(string), typeof(LabeledTextBox), new UIPropertyMetadata(""));
public string Value
{
get { return (string)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
// Using a DependencyProperty as the backing store for Value. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(string), typeof(LabeledTextBox), new UIPropertyMetadata(""));
}
XAML:
<Style TargetType="{x:Type local:LabeledTextBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:LabeledTextBox}">
<Grid>
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Label Grid.Row="0" Content="{TemplateBinding Caption}" />
<TextBox Name="Box" Margin="3,0,3,3" Grid.Row="1" Text="{Binding Value, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" />
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
用法:
<uc:LabeledTextBox Caption="Code:" Value="{Binding ExpenseCode}" />
最初我以为我在这里找到了答案:WPF TemplateBinding vs RelativeSource TemplatedParent
Initially I thought I had found my answer here: WPF TemplateBinding vs RelativeSource TemplatedParent
这详细说明了 TemplateBinding
和 RelativeSource TemplatedParent
之间的区别.我已经相应地更改了我的代码,但仍然感觉我错过了一步.OneWay 绑定确实有效,我的文本框绑定到 Value 属性,但更改不会注册.
That details the difference between TemplateBinding
and RelativeSource TemplatedParent
. I've changed my code accordingly, but it still feels like I'm missing a step. The OneWay binding does work, my textbox is bound to the Value property, but changes do not register.
如何让它工作?
推荐答案
在此处更改模式.
<uc:LabeledTextBox Caption="Code:" Value="{Binding ExpenseCode,Mode=TwoWay}" />
它在我的最后工作
这篇关于如何在 UserControl 中使用 TwoWay 绑定?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!