Listview中的ListView - 选择子项时未设置父项的SelectedIndex

时间:2016-07-15 11:21:34

标签: c# listview mvvm data-binding uwp

我有一个在ListView中显示ListView的UI:

<ListView
    SelectedIndex="{x:Bind ParentViewModel.SelectedParentIndex, Mode=TwoWay}"
    ItemsSource="{x:Bind ParentViewModel.ParentViewModels, Mode=OneWay}">

    <ListView.ItemTemplate>
        <DataTemplate x:DataType="viewModels:ParentViewModel">
            <StackPanel>
                <TextBlock Text="{Binding ParentName}" />

                <ListView
                    SelectedIndex="{x:Bind SelectedChildIndex, Mode=TwoWay}"
                    ItemsSource="{Binding ChildViewModels, Mode=OneWay}">

                    <ListView.ItemTemplate>
                        <DataTemplate x:DataType="viewModels:ChildViewModel">

                        <TextBlock Text="{Binding ChildName}" />

                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

当我点击父元素时,SelectedParentIndex被设置,当我点击子元素时,SelectedChildIndex被设置。

我的问题是当我点击一个子元素时,我不知道它所属的父元素,因为未设置SelectedParentIndex。我该如何解决这个问题?

流程应该如何:enter image description here

1 个答案:

答案 0 :(得分:2)

只需添加一个事件。这是一个已编译的工作示例。

        <ListView
            ItemsSource="{Binding ParentViewModels, Mode=OneWay}"
            SelectedIndex="{Binding SelectedParentIndex, Mode=TwoWay}"
            SelectedItem="{Binding SelectedParent,Mode=TwoWay}">

            <ListView.ItemTemplate>
                <DataTemplate >
                    <StackPanel>
                        <TextBlock Text="{Binding ParentName}" />

                        <ListView                        
                        ItemsSource="{Binding ChildViewModels, Mode=OneWay}"
                        SelectedIndex="{Binding SelectedChildIndex, Mode=TwoWay}"
                        SelectedItem="{Binding SelectedChild,Mode=TwoWay}">   

                            <ListView.ItemTemplate>
                                <DataTemplate>

                                    <TextBlock Text="{Binding ChildName}" />

                                </DataTemplate>
                            </ListView.ItemTemplate>
                        </ListView>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

以下是cs文件。请密切注意结构。

MasterViewModel是您DataContext的{​​{1}}。它处理ViewSelectedParent和您的父母集合。

SelectedParentIndex

您的 public class MasterViewModel : ViewModelBase { private ParentViewModel _SelectedParent; public ParentViewModel SelectedParent { get { return _SelectedParent; } set { _SelectedParent = value; OnPropertyChanged("SelectedParent"); } } private int _SelectedParentIndex; public int SelectedParentIndex { get { return _SelectedParentIndex; } set { _SelectedParentIndex = value; OnPropertyChanged("SelectedParentIndex"); } } public ObservableCollection<ParentViewModel> ParentViewModels { get; private set; } public MasterViewModel() { ParentViewModels = new ObservableCollection<ParentViewModel>(); LoadData(); } private void LoadData() { for(int x = 0; x < 10; x++) { ParentViewModel parent = new ParentViewModel(); parent.ChildChangedEvent += Parent_ChildChangedEvent; for(int y = 0; y < 20; y++) { ChildViewModel child = new ChildViewModel() { ChildName = "Child " + y }; parent.ChildViewModels.Add(child); } ParentViewModels.Add(parent); } } private void Parent_ChildChangedEvent(object sender, EventArgs e) { SelectedParent = (ParentViewModel)sender; } } 包含ParentViewModelSelectedChildIndexSelectedChild收藏。它还有一个名称属性

请注意,我向ChildViewModels添加了EventHandler。更新ParentViewModel后,会触发该事件。然后,我们在SelectedChild处理此事件,我们可以强制MasterViewModel进行更新。

SelectedParent

您的 public class ParentViewModel : ViewModelBase { public String ParentName { get; set; } private int _SelectedChildIndex; public int SelectedChildIndex { get { return _SelectedChildIndex; } set { _SelectedChildIndex = value; OnPropertyChanged("SelectedChildIndex"); } } private ChildViewModel _SelectedChild; public ChildViewModel SelectedChild { get { return _SelectedChild; } set { _SelectedChild = value; OnPropertyChanged("SelectedChild"); if (ChildChangedEvent != null) { ChildChangedEvent(this, new EventArgs()); } } } public ObservableCollection<ChildViewModel> ChildViewModels { get; private set; } public event EventHandler ChildChangedEvent; public ParentViewModel() { ChildViewModels = new ObservableCollection<ChildViewModel>(); } } 只有一个名称属性。

ChildViewModel

ViewModelBase只更新UI

    public class ChildViewModel : ViewModelBase
    {
        private string _childName;

        public string ChildName
        {
            get { return _childName; }
            set 
            { 
              _childName = value; 
              OnPropertyChanged("ChildName"); 
            }
        }

    }

enter image description here

enter image description here

enter image description here