Привязка в нескольких видах к ObservableCollection выбранных элементов (MVVM, SL5) - PullRequest
0 голосов
/ 04 января 2012

Я использую MVVM с Silverlight 5. Я хочу выбрать элементы в ListBox в одном виде (например, ListView.xaml) и отобразить выбранные элементы в ListBox в другом виде (например SelectionView.xaml).

Мои выбранные элементы находятся в ObservableCollection<MyItem> (называемом SelectedItems), который создается с помощью прикрепленного поведения, как описано в этом ответе

Кажется, проблема в том, что я использую два разных файла XAML. Если я связываю ListBox с SelectedItems в том же файле XAML, где происходит выбор, элементы отображаются в другом ListBox в том же виде без проблем. Но в другом файле ListBox остается пустым.

Оба представления используют тот же ViewModel, что и DataContext.

Я был бы очень рад по поводу некоторых указателей в правильном направлении. Я новичок в SL, поэтому, возможно, я упускаю что-то очевидное.

Это код, который работает:

ListView.xaml

<UserControl x:Class="Silverlight5App.View.Content.ListView"
    xmlns:viewModel="clr-namespace:Silverlight5App.ViewModel"
    xmlns:behaviours="clr-namespace:Silverlight5App.Behaviours">


    <UserControl.Resources>
        <viewModel:XYPlotViewModel x:Key="ViewModelTest" />
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource ViewModelTest}}">
        <StackPanel>            
            <ListBox  ItemsSource="{Binding Path=XYPoints}"  behaviours:SelectedItems.Items="{Binding SelectedItems}" Name="XYPointsListbox" SelectionMode="Extended" >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="100" />
                                <ColumnDefinition Width="100" />
                                <ColumnDefinition Width="100" />
                            </Grid.ColumnDefinitions>
                            <TextBlock Grid.Column="0" Margin="2" Text="{Binding id}" />
                            <TextBlock Grid.Column="1" Margin="2" Text="{Binding x}" />
                            <TextBlock Grid.Column="2" Margin="2" Text="{Binding y}" />
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

            <ListBox ItemsSource="{Binding SelectedItems}"  Name="XYPointsListboxSelection">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="100" />
                                <ColumnDefinition Width="100" />
                                <ColumnDefinition Width="100" />
                            </Grid.ColumnDefinitions>
                            <TextBlock Grid.Column="0" Margin="2" Text="{Binding id}" />
                            <TextBlock Grid.Column="1" Margin="2" Text="{Binding x}" />
                            <TextBlock Grid.Column="2" Margin="2" Text="{Binding y}" />
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </StackPanel>
    </Grid>
</UserControl>

и этот код просто дает пустой список:

SelectionView.xaml

    <UserControl x:Class="Silverlight5App.View.Content.SelectionView"
    xmlns:viewModel="clr-namespace:Silverlight5App.ViewModel"     
    xmlns:behaviours="clr-namespace:Silverlight5App.Behaviours">

    <UserControl.Resources>
        <viewModel:XYPlotViewModel x:Key="ViewModelTest" />
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource ViewModelTest}}" >       
        <StackPanel>               
            <ListBox ItemsSource="{Binding Path=SelectedItems}"  Name="XYPointsListboxSelection2">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="100" />
                            <ColumnDefinition Width="100" />
                            <ColumnDefinition Width="100" />
                        </Grid.ColumnDefinitions>
                        <TextBlock Grid.Column="0" Margin="2" Text="{Binding id}" />
                        <TextBlock Grid.Column="1" Margin="2" Text="{Binding x}" />
                        <TextBlock Grid.Column="2" Margin="2" Text="{Binding y}" />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        </StackPanel>
    </Grid>
</UserControl>

PS: подсветка синтаксиса установлена ​​на language-all: lang-xml, но, похоже, не работает?

1 Ответ

1 голос
/ 05 января 2012

Вы должны использовать тот же экземпляр ViewModel , чтобы это работало.

Вы можете сделать это, создав модель представления в виде Singleton и назначив ее не через XAML, а с помощью кода (либо в конструкторе, либо в событии PageLoaded).

...