如何使用双向从一个用户控件内绑定?(How to use TwoWay binding from w

2019-09-16 15:23发布

我有我自己的用户控件,一个LabeledTextBox这是一个组合Label和a..well, TextBox 。 此控制具有两个属性: Caption将被绑定到的标题Label ,和Value将被绑定到Text的的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

这细节的区别TemplateBindingRelativeSource TemplatedParent 。 我因此改变了我的代码,但它仍然感觉就像我缺少一个步骤。 单向绑定不工作,我的文本框被绑定到Value属性,但变化不会注册。

我如何得到这个工作?

Answer 1:

这里改变模式。

<uc:LabeledTextBox Caption="Code:" Value="{Binding ExpenseCode,Mode=TwoWay}"  /> 

它的工作在我结束



Answer 2:

万一有人有这样的问题:

另一种方法(也许更优雅)将宣布该用户控件的依赖属性的方式,以便它默认为双向绑定(例如,作为框架文本框的默认操作)。

这是可以实现如下(从答案采取这个问题#1 ):

    public DependencyProperty SomeProperty =
        DependencyProperty.Register("Some", typeof(bool), typeof(Window1),
            new FrameworkPropertyMetadata(default(bool),
                FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

这里的关键是使用FrameworkPropertyMetadata



文章来源: How to use TwoWay binding from within a UserControl?