为什么绑定到视图模型时我的自定义WPF控件属性不起作用?

时间:2018-05-16 16:44:33

标签: c# wpf custom-controls

当我将其绑定时,我的自定义控件无效(文本块显示我的视图模型属性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>

1 个答案:

答案 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}}" 
    />