CodeGo.net>与用户控件的双向绑定

我试图在我创建的UserControl上设置双向绑定.

当我在Xaml中使用控件时,像这样设置DataContext …

<uc:MyUserControl DataContext="{Binding Path=MyObject, Mode=TwoWay}" />

我的用户控件定义如下:

<UserControl x:Class="SilverlightApplication1.XText"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">
        <TextBox x:Name="Text" Text="{Binding}"/>

    </Grid>
</UserControl>

数据正确显示,但是,如果我进行更改,则希望通过TwoWay绑定进行更新.

我在下面尝试过此方法,但由于未定义路径,因此在运行时会出错.

    <Grid x:Name="LayoutRoot" Background="White">
        <TextBox x:Name="Text" Text="{Binding Mode=TwoWay}"/>

    </Grid>
</UserControl>

关于如何使用户控件内部的控件双向绑定到DataContext的任何想法?

解决方法:

尽管您上面的问题(自动回答)似乎可以解决问题,但我不禁认为这是一个问题领域的问题.我很难思考为什么您首先要像那样直接绑定,特别是因为它使您对数据发生的情况的控制较少.

采取以下措施:

<UserControl 
    x:Class="SilverlightApplication1.XText"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    x:Name="UserControl"
    d:DesignHeight="300" 
    d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">
        <TextBox x:Name="Text" Text="{Binding Path=Value, ElementName=UserControl, Mode=TwoWay}"/>    
    </Grid>
</UserControl>

然后在后面的代码中:

public partial class XText
{
    public static DependencyProperty ValueProperty =
        DependencyProperty.Register(
            "Value",
            typeof(string),
            typeof(XText),
            new FrameworkPropertyMetadata(null)
        );

    public string Value
    {
        get { return ((string)(base.GetValue(XText.ValueProperty))); }
        set { base.SetValue(XText.ValueProperty, value); }
    }

    ...
}

然后,当您准备使用它时:

<uc:XText Value="{Binding Path=MyObject, Mode=TwoWay}" />

是的,它是更多的代码,但是它使您可以更好地控制UserControl内部的Value所发生的情况,并使将来使用此代码更加简单.

有什么想法吗?

-道格

编辑:修复了一些错字.

上一篇:如何在XAML中从DataTemplate引用匹配的对象?


下一篇:C#-WPF控件的有条件加载