当我将其绑定时,我的自定义控件无效(文本块显示我的视图模型属性Test
很好,但我的自定义控件显示默认值empty
):
<local:DynamicMenu Text="{Binding Test}"/>
<TextBlock Text="{Binding Test}"></TextBlock>
如果我有静态值,它确实有效:
<local:DynamicMenu Text="test"/>
<TextBlock Text="{Binding Test}"></TextBlock>
它是这样实现的。我更喜欢一种能让它像TextBlock一样工作的解决方案。
.Xaml.CS
public partial class DynamicMenu : UserControl
{
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text",
typeof(string),
typeof(DynamicMenu),
new FrameworkPropertyMetadata("Empty",
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public DynamicMenu()
{
InitializeComponent();
}
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
}
.XAML
<UserControl x:Class="Whelen.Griffin.Views.DynamicMenu"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
DataContext="{Binding RelativeSource={RelativeSource Self}}" >
<TextBlock Text="{Binding Text}"></TextBlock>
</UserControl>
答案 0 :(得分:1)
这是你的问题:
DataContext="{Binding RelativeSource={RelativeSource Self}}" >
父XAML中的绑定在DynamicMenu的DataContext上查找名为Test
的属性。这应该是viewmodel,但遗憾的是你将其DataContext设置为自身,并且它没有名为Test的属性。
不要将UserControl的DataContext设置为this
。这是一个经典的错误。
删除设置DataContext的那一行,改为:
<TextBlock
Text="{Binding Text, RelativeSource={RelativeSource AncestorType=UserControl}}"
/>