我试图在我创建的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所发生的情况,并使将来使用此代码更加简单.
有什么想法吗?
-道格
编辑:修复了一些错字.