содержание аккордеонашаблонная связь с моделью представления - PullRequest
0 голосов
/ 07 февраля 2012

В проекте Silverlight 5 mvvm у меня есть следующий код:

Вид:

<navigation:Page x:Class="LobDemo.View.MainView" 
             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"
             xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
             xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"
             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="600"
             DataContext="{Binding Source={StaticResource Locator}, Path=Main}" >
<Grid x:Name="LayoutRoot">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <toolkit:DockPanel Grid.Column="0">
        <toolkit:Accordion Name="accordion1" 
                           HorizontalAlignment="Stretch"
                           VerticalAlignment="Stretch"
                           ItemsSource="{Binding Path=MenuItems}"
                           Margin="5,5,5,5">
            <toolkit:Accordion.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=Name}" />
                </DataTemplate>
            </toolkit:Accordion.ItemTemplate>
            <toolkit:Accordion.ContentTemplate>
                <DataTemplate>
                    <ListBox ItemsSource="{Binding Path=SubMenuItems}"
                             Margin="2 2 0 0"
                             BorderThickness="0"
                             SelectedItem="{Binding Path=SelectedMenuItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Path=Name}" />
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </DataTemplate>
            </toolkit:Accordion.ContentTemplate>
        </toolkit:Accordion>
    </toolkit:DockPanel>
</Grid>

ViewModel: (я только показываю необходимые свойства)

public ObservableCollection<MenuItem> MenuItems
{
    get { return _menuItems; }
    set 
    {
       _menuItems = value;
       RaisePropertyChanged("MenuItems");
    }
}

public object SelectedMenuItem
{
    get { return _selectedMenuItem; }
    set
    {
        _selectedMenuItem = value;
        RaisePropertyChanged("SelectedMenuItem");
    }
}

MenuItem:

public string Name { get; set; }

public ObservableCollection<SubMenuItem> SubMenuItems { get; set; }

SubMenuItem:

public string Name { get; set; }

Код работает нормально, мои MenuItems видны в элементе управления аккордеоном, SubMenuItems также загружаются в список. Проблема возникает, когда я выбираю один из элементов в списке, я хочу, чтобы о выбранном элементе сообщалось обратно в мою ViewModel как SelectedMenuItem. Но свойство SelectedMenuItem никогда не заполняется, поэтому я предполагаю, что код не может определить местоположение свойства. Может кто-нибудь указать, что я делаю не так?

1 Ответ

1 голос
/ 07 февраля 2012

Я нашел решение для моей проблемы, я обновил код Accordion.ContentTemplate в представлении, код теперь выглядит так:

<toolkit:Accordion.ContentTemplate>
<DataTemplate>
    <ListBox ItemsSource="{Binding Path=SubMenuItems}"
                Margin="2 2 0 0"
                BorderThickness="0"
                SelectedItem="{Binding RelativeSource={RelativeSource AncestorType=navigation:Page}, Path=DataContext.SelectedMenuItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Path=Name}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</DataTemplate>

С этим кодом представление теперь находит свойство SelectedMenuItem в ViewModel

...