在两个或多个ListView之间绑定ListView SelectedItem

时间:2013-08-01 14:32:32

标签: c# wpf listview mvvm listviewitem

我有一个包含ObservableCollection的字典,如下所示:

Dictionary<string, ObservableCollection<Person>> MyDictionary

现在在我的xaml中,我正在创建一个itemscontrol,它使用扩展器的字典键和listview这样的人的集合:

<ItemsControl   ItemsSource="{Binding MyDictionary}" VerticalAlignment="Center" HorizontalAlignment="Left">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Vertical"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Expander Name="expander" IsExpanded="True">
                            <Expander.Header>
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Margin="5" VerticalAlignment="Stretch" HorizontalAlignment="Left" Text="MyString:"/>
                                    <TextBlock Margin="5" VerticalAlignment="Stretch" HorizontalAlignment="Left" Text="{Binding Key}"/>
                                </StackPanel>
                            </Expander.Header>
                            <Expander.Content>
                                <ListView SelectionMode="Single" ItemsSource="{Binding Value}">

                                    <ListView.View>
                                        <GridView  AllowsColumnReorder="True">

                                            <GridViewColumn>
                                                <GridViewColumn.Header>
                                                    <TextBlock Text="Name"  Margin="5" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                                </GridViewColumn.Header>
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <TextBlock Text="{Binding Name}" Margin="5" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>

                                            <GridViewColumn>
                                                <GridViewColumn.Header>
                                                    <TextBlock Text="Last Name" Margin="5" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                                </GridViewColumn.Header>
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <TextBlock Text="{Binding LastName}" Margin="5" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
                                        </GridView>
                                    </ListView.View>
                                </ListView>
                            </Expander.Content>
                        </Expander>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>

现在,您可以看到它创建了一个扩展器集合,每个扩展器都在其内容中有一个列表视图...

我想只让一个列表视图有一个选定的项目,我该怎么做?

如果我不清楚:我将有3个Expanders,每个{1} ListView,每个ListView有4-5个项目,我希望当用户点击时<{1}}所有其他listviewitem个所选项目都将被取消选中。

谢谢!

2 个答案:

答案 0 :(得分:0)

为什么不订阅每个列表视图的选择事件,并在其他列表视图上调用UnselectAll

答案 1 :(得分:0)

嘿我有这个想法。将所有listBox的SelectedItem绑定到ViewModel的相同SelectedItemProperty,如

&gt; xaml这里我有两个ListBox,其SelectedItem绑定到VM的相同属性

<StackPanel Height="500" Width="500">
        <ListBox Height="200" ItemsSource="{Binding StudentList1}" DisplayMemberPath="Name" SelectedItem="{Binding SelectedStudent}"></ListBox>
        <ListBox Height="200" ItemsSource="{Binding StudentList2}" DisplayMemberPath="Name" SelectedItem="{Binding SelectedStudent}"></ListBox>
    </StackPanel>
  

xaml.cs

public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModel();
    }
  

视图模型

public class ViewModel:INotifyPropertyChanged
    {
        public ViewModel() 
        {
            StudentList1 = new ObservableCollection<Student>();
            StudentList1.Add(new Student() { Name = "abc", Age = 20 });
            StudentList1.Add(new Student() { Name = "abc", Age = 20 });
            StudentList1.Add(new Student() { Name = "abc", Age = 20 });

            StudentList2 = new ObservableCollection<Student>();
            StudentList2.Add(new Student() { Name = "xyz", Age = 30 });
            StudentList2.Add(new Student() { Name = "xyz", Age = 30 });
            StudentList2.Add(new Student() { Name = "xyz", Age = 30 });
        }
        public ObservableCollection<Student> StudentList1 { get; set; }

        public ObservableCollection<Student> StudentList2 { get; set; }

        Student selectedStudent;

        public Student SelectedStudent
        {
            get { return selectedStudent; }
            set { selectedStudent = value; Notify("SelectedStudent"); }
        }
        public void Notify(string propName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propName));

        }
        public event PropertyChangedEventHandler PropertyChanged;
    }
  

学生班

public class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

我希望你有一个想法.SelectedItem在References的基础上工作,当你选择一个Listbox项时,VM的SelectedStudent属性将被更新,因此所有其他ListBox SelectedItem将被取消选择,因为它们在itemssource中没有这个引用。 MVVM的力量:)

<强>&GT;更新

Student selectedStudent1;

        public Student SelectedStudent1
        {
            get { return selectedStudent1; }
            set {
                  selectedStudent=null;
                  selectedStudent1 = value;
                  Notify("SelectedStudent1"); }
        }

Student selectedStudent;

        public Student SelectedStudent
        {
            get { return selectedStudent; }
            set {
                  selectedStudent1=null;
                  selectedStudent = value; 
                  Notify("SelectedStudent"); }
        }