繁体   English   中英

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

[英]Binding ListView SelectedItem between two or more ListViews

我有一个包含这样的ObservableCollection的Dictionary:

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>

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

我只想让一个listview选中一项,该怎么办?

如果我不清楚:我将有3个Expanders ,每个都有1个ListView ,每个ListView都有4-5个项目,我希望当用户单击listviewitem所有其他ListViews选定的项目都不会被选中。

谢谢 !

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

嘿,我有个主意。 将所有列表框的SelectedItem绑定到ViewModel的相同SelectedItemProperty

> 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将在“引用”的基础上工作,VM的SelectedStudent属性将被更新,因此所有其他ListBox SelectedItem将被取消选择,因为它们在此itemsource中没有此引用。 MVVM的力量:)

>更新

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"); }
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM