【问题标题】:Binding in multiple views to ObservableCollection of selected items (MVVM, SL5)在多个视图中绑定到所选项目的 ObservableCollection (MVVM, SL5)
【发布时间】:2012-02-02 08:33:13
【问题描述】:

我正在使用带有 Silverlight 5 的 MVVM。我想要实现的是在一个视图中选择 ListBox 中的项目(例如 ListView.xaml)并在另一个视图中显示 ListBox 中的选定项目(例如SelectionView.xaml)。

我选择的项目位于ObservableCollection<MyItem>(称为SelectedItems)中,它是通过in this answer 所述的附加行为创建的

问题似乎是我使用了两个不同的 XAML 文件。如果我在选择发生的同一个 XAML 文件中将 ListBox 绑定到 SelectedItems,则项目会在同一视图中的另一个 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 但似乎不起作用?

【问题讨论】:

    标签: data-binding observablecollection silverlight-5.0 attachedbehaviors multiple-views


    【解决方案1】:

    您应该使用相同的 ViewModel 实例才能使其正常工作。

    您可以通过将视图模型创建为 Singleton 并通过代码(在构造函数或 PageLoaded 事件中)而不是通过 XAML 分配它来实现。

    【讨论】:

    • 谢谢,这正是我需要的信息!我不知道我创建了我的 ViewModel 的一个新实例。还有很多关于如何制作单例视图模型的信息,比如this example
    猜你喜欢
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2012-10-23
    相关资源
    最近更新 更多