WPF:无法绑定到自定义控件依赖项属性

时间:2013-09-27 23:58:46

标签: dependency-properties

我创建了一个带有数据绑定依赖项属性的自定义控件。 然后,绑定的值应显示在文本框中。 这种绑定可以正常工作。

实现自定义控件时会出现问题。网格的数据上下文是一个简单的视图模型,其中包含用于绑定的String属性。

  1. 如果我将此属性绑定到标准的wpf控件文本框,一切正常。
  2. 如果我将属性绑定到我的自定义控件,则不会发生任何事情。
  3. 经过一些调试后,我发现在 CustomControl 中搜索了 SampleText 。当然它并不存在。 为什么我的属性在 CustomControl 中搜索,而不是从场景1中发生的 DataContext 中搜索。

        <Window x:Class="SampleApplicatoin.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:controls="clr-namespace:SampleApplication"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Grid.DataContext>
                <controls:ViewModel/>
            </Grid.DataContext>
            <TextBox Text="{Binding SampleText}"/>
            <controls:CustomControl TextBoxText="{Binding SampleText}"/>
        </Grid>
    </Window>
    

    自定义控件的 XAML 代码下方。 我使用 DataContext = Self 从后面的代码中获取依赖项属性:

    <UserControl x:Class="SampleApplication.CustomControl"
                 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}}">
        <Grid>
            <TextBox HorizontalAlignment="Left" Height="23" Margin="87,133,0,0" TextWrapping="Wrap" Text="{Binding TextBoxText}" VerticalAlignment="Top" Width="120"/>
        </Grid>
    </UserControl>
    

    xaml.cs文件只包含依赖项属性:

    public partial class CustomControl : UserControl
        {
            public static readonly DependencyProperty TextBoxTextProperty = DependencyProperty.Register("TextBoxText", typeof (String), typeof (CustomControl), new PropertyMetadata(default(String)));
    
            public CustomControl()
            {
                InitializeComponent();
            }
    
            public String TextBoxText
            {
                get { return (String) GetValue(TextBoxTextProperty); }
                set { SetValue(TextBoxTextProperty, value); }
            }
        }
    

    感谢您提供任何帮助。它现在让我疯狂。

    修改

    我刚刚找到了两个可能的解决方案:

    这是第一个(对我有用):

    <!-- Give that child a name ... -->
    <controls:ViewModel x:Name="viewModel"/>
    <!-- ... and set it as ElementName -->
    <controls:CustomControl TextBoxText="{Binding SampleText, ElementName=viewModel}"/>
    

    第二个。这在我的情况下不起作用。我不知道为什么:

    <controls:CustomControl TextBoxText="{Binding SampleText, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type controls:ViewModel}}}"/>
    <!-- or -->
    <controls:CustomControl TextBoxText="{Binding SampleText, RelativeSource={RelativeSource FindAncestor, AncestorType=controls:ViewModel}}"/>
    

1 个答案:

答案 0 :(得分:1)

我有类似的情况。 在我的例子中,我通过在ViewModel中的setter属性中添加OnPropertyChanged来修复它。