Почему свойство зависимостей моего Custom UserControl не работает с динамическим связыванием? - PullRequest
0 голосов
/ 09 декабря 2011

Свойство зависимостей My Custom UserControl будет привязано правильно, если значение статически определено в вызывающем его XAML, например:

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>

Код пользовательского контроля пользователя:

 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;
    }

Этот код успешно добавил мой пользовательский элемент управления UserControl как ListBoxItem в ListBox, но проблема в том, что он не отображает текст, который я связываю.

Я не понимаю, где я делаю неправильно.

1 Ответ

3 голосов
/ 09 декабря 2011

Вы устанавливаете DataContext UserControl на себя, все привязки будут пытаться найти путь в UserControl, поэтому вам не следует устанавливать DataContext на UserControls.

Вы должны увидеть ошибку привязки в окне «Вывод» Visual Studio, говорящую что-то вроде:

System.Windows.Data Ошибка: 40: Ошибка пути BindingExpression: свойство 'ItemTypeIdCode' не найдено в 'объекте' '' UserControl1 '(Name =' UserControl ')'. ...

...