Привязка от itemscontrol к usercontrol - PullRequest
1 голос
/ 01 ноября 2011

У меня есть пользовательский контроль с именем MessageElementControl. он содержится в MessageElementContainerControl. когда я вызываю MessageElementControl, я пытаюсь передать ему некоторые свойства из контейнера, но эти свойства не устанавливаются. когда я пытаюсь использовать их внутри MessageElementControl, они становятся нулевыми. проблемные свойства ParentCollection и ParentObject. Я делаю это так, чтобы, когда пользователь что-то делал с обновлением или удалением MessageElementControl, я мог внести необходимые изменения в коллекцию. вот XAML для контейнера. вопрос в том, как сделать так, чтобы эти свойства получили правильное значение или если бы я использовал совершенно другой подход ко всему этому?

<UserControl x:Class="Bix.MessageElementContainerControl" Loaded="ThisControl_Loaded"
             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" x:Name="ThisControl" xmlns:my="clr-namespace:Bix" 
             >
    <UserControl.Resources>

        <ObjectDataProvider x:Key="MessageElementDataProvider" ObjectType="{x:Type my:MessageElementDataProvider}"/>

        <ObjectDataProvider x:Key="MessageUIElements"
          ObjectInstance="{StaticResource MessageElementDataProvider}"
          MethodName="GetUIMessageElements"/>

        <DataTemplate x:Key="MessageElement">
            <my:MessageElementControl Width="{Binding ElementName=ThisControl,Path=Width}" 
                                          Element="{Binding Path=Element}" 
                                          ParentCollection="{Binding ElementName=ThisControl,Path=ItemsSource}" 
                                          ParentObject="{Binding ElementName=ThisControl,Path=ParentObjectSource}"/>
        </DataTemplate>

    </UserControl.Resources>
    <StackPanel Height="Auto" Name="panel1">
        <StackPanel Orientation="Horizontal" Height="Auto" Name="panel2">
            <Label Content="Attachments and Data" FontSize="18" FontWeight="Bold" Foreground="#FF5A5A5A" Height="34" HorizontalAlignment="Left" Name="label6" VerticalAlignment="Top" Width="{Binding ElementName=ThisControl,Path=LabelWidth}" />
            <Button Margin="0,4" Height="25" HorizontalAlignment="Left" Name="btnNew" Padding="3" VerticalAlignment="Top" Width="60" Click="btnNew_Click">
                <TextBlock FontSize="12" FontWeight="Bold" Foreground="#FF3C3C3C" Text="New" TextWrapping="Wrap"/>
            </Button>
        </StackPanel>
        <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" Width="{Binding ElementName=ThisControl,Path=Width}">
            <ItemsControl Name="itmsElements" Margin="0" 
                          ItemsSource="{Binding Source={StaticResource MessageUIElements}}" 
                          Width="{Binding ElementName=ThisControl,Path=Width}"
                          ItemTemplate="{Binding Source={StaticResource MessageElement}}">

            </ItemsControl>
        </ScrollViewer>
    </StackPanel>
</UserControl>

ОБНОВЛЕНИЕ: найдено. Я использовал ThisControl в качестве имени для контейнера и содержимого. так что связывания на самом деле не было. нашел полезный пост об отладке привязок wpf, который помог мне разобраться. devcomponents.com / блог /? Р = 312

1 Ответ

0 голосов
/ 01 ноября 2011

Я бы подумал, что можно было бы связать контейнер сбора с ObservableCollection (MessageUIElements) из MessageElement, выбранный вами элемент со свойством типа MessageElement - все в классе который реализует интерфейс INotifyPropertyChanged на тот случай, если вы хотите извлечь выбранный элемент из кода.

...