为什么我的Custom UserControl的依赖属性不能用于动态绑定?

时间:2011-12-09 19:18:58

标签: c# wpf xaml data-binding wpf-controls

如果在调用它的XAML中静态定义了值,我的自定义UserControl的依赖项属性将正确绑定,如下所示:

TextBoxText="myName"

但不是如果值本身是动态绑定的:

TextBoxText="{Binding ItemTypeIdCode}"

我的完整代码。

自定义UserControl XAML:

<UserControl
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:Class="TestUserControl.UserControl1"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
x:Name="UserControl" Height="22" Width="282">

<Grid x:Name="LayoutRoot">
    <TextBlock TextWrapping="Wrap" Text="{Binding MyName, ElementName=LayoutRoot}"/>
</Grid>

自定义UserControl代码:

 public static readonly DependencyProperty TextBoxTextProperty =DependencyProperty.Register("TextBoxText", typeof(string), typeof(UserControl1));

    public string TextBoxText
    {
        get { return (string)GetValue(TextBoxTextProperty); }
        set { SetValue(TextBoxTextProperty, value); }
    }

在我的主窗口XAML中:

    <Grid x:Name="LayoutRoot">
    <Button Content="Button" Height="78" Margin="0,0,93,112" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="94" Click="MyButtonClick"/>
    <ListBox x:Name="MyListBox" HorizontalAlignment="Left" Margin="8,8,0,112" Width="192">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <local:UserControl1 HorizontalAlignment="Stretch" Margin="286,37,56,0" VerticalAlignment="Top" d:LayoutOverrides="Height" TextBoxText="{Binding MyName}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

在我的主窗口代码中:

    private void MyButtonClick(object sender, System.Windows.RoutedEventArgs e)
    {
        List<string> MyName = new List<string>();
        MyName.Add("Name 1");
        MyName.Add("Name 2");
        MyName.Add("Name 3");
        MyListBox.ItemsSource = MyName;
    }

此代码在ListBox中成功将我的自定义用户控件添加为ListBoxItem但问题是它没有显示任何我绑定的文本。

我不明白我做错了什么。

1 个答案:

答案 0 :(得分:3)

您将UserControl的DataContext设置为自身,然后所有绑定都会尝试在UserControl上找到路径,这就是您不应在UserControl上设置DataContext的原因。

您应该在Visual Studio的“输出”窗口中看到绑定错误,如下所示:

  

System.Windows.Data错误:40:BindingExpression路径错误:'object'''UserControl1'(Name ='UserControl')'上找不到'ItemTypeIdCode'属性。 ...