Связывание элементов управления внутри коллекции - PullRequest
0 голосов
/ 14 сентября 2011

У меня есть приложение WPF со сменными представлениями.Представление наследуется от моего класса ViewBase:

public class ViewBase : ContentControl, IView
{
    public ViewBase()
    {
        ToolbarGroups = new ObservableCollection<ToolbarGroup>();
    }

    public ObservableCollection<ToolbarGroup> ToolbarGroups
    {
        get { return (ObservableCollection<ToolbarGroup>)GetValue(ToolbarGroupProperty); }
        private set { SetValue(ToolbarGroupProperty, value); }
    }

    public static readonly DependencyProperty ToolbarGroupProperty = 
                DependencyProperty.Register("ToolbarGroup", typeof(ObservableCollection<ToolbarGroup>), typeof(ViewBase));
}

Я связываю свойство ToolbarGroups с ItemsControl в моем окне.Это прекрасно работает.

ToolBarGroup наследуется от HeaderedContentControl, и я подключаю их внутри представления, подобного этому:

<base:ViewBase x:Class="TestApp.Orders.OrderDetailsView"
               xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
               xmlns:base="clr-namespace:TestApp"
               xmlns:local="clr-namespace:TestApp.Orders"
               xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
               xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
               x:Name="root">

    <base:ViewBase.ToolbarGroups>
        <base:ToolbarGroup Header="Group1">
            <!-- Buttons and other controls go here -->
        </base:ToolbarGroup>

        <!-- Binding to MyProp is the problem -->
        <local:PremadeToolbarGroup MyProp="{Binding}" />

        <!-- This also doesn't work -->
        <local:PremadeToolbarGroup MyProp="{Binding ElementName=root,Path=DataContext}" />
    </base:ViewBase.ToolbarGroups>

        <Grid>
            <!-- this binding works -->
            <TextBox Text="{Binding Path=Model.FullName}" />
        </Grid>
</base:ViewBase>

PremadeToolbarGroup - это файл XAML, который наследуется от ToolbarGroup и добавляет некоторые кнопки,PremadeToolbarGroup содержит свойство зависимости MyProp, которое я хочу привязать к DataContext представления, в котором он используется.

Мой DataContext установлен в объект типа ViewModelBase, который также является типом для свойства зависимостей MyProp..

PremadeToolbarGroup отображается, как и ожидалось, но привязка никогда не работает (MyProp всегда равен нулю).Есть мысли?

Ответы [ 2 ]

0 голосов
/ 15 сентября 2011

Я нашел решение:

В моем окне представление отображается в ContentPresenter:

<ContentPresenter Margin="3" x:Name="ViewPresenter" />

Для свойства content установлено значение View через выделенный код.

Как я уже сказал в своем вопросе: «Я связываю свойство ToolbarGroups с ItemsControl в моем окне».

Поэтому я отображаю ToolbarGroups в другом месте окна следующим образом:

<ItemsControl ItemsSource="{Binding ElementName=ViewPresenter, Path=Content.ToolbarGroups}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

Объекты ToolbarGroup не смогли привязаться к DataContext представления, поскольку они были добавлены в визуальное дерево вне представления.

Мне удалось исправить это, связавDataContext каждого элемента в ItemsControl к DataContext содержимого ViewPresetner.Это выглядит так:

<ItemsControl ItemsSource="{Binding ElementName=ViewPresenter, Path=Content.ToolbarGroups}">
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="FrameworkElement.DataContext" Value="{Binding ElementName=ViewPresenter,Path=Content.DataContext }"/>
        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

Это немного грязно, но работает.Я, конечно, открыт для более элегантного решения, если у кого-то есть.

0 голосов
/ 14 сентября 2011

Установлен ли DataContext где-нибудь?Попробуйте добавить DataContext = this в конструктор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...