2016-07-15 54 views
1

時沒有設置我有顯示在ListView一個ListView一個UI:的ListView ListView中 - 父母的SelectedIndex選擇孩子

<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

+0

能否請您澄清你的問題是什麼? –

+0

我想在點擊一個當前不是這種情況的子元素時也得到SelectedParentIndex更新 – TableCreek

+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爲您的View。它處理SelectedParentSelectedParentIndex和你父母的收藏。

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

ParentViewModel包含您SelectedChildIndex,你SelectedChild和你ChildViewModels收藏。它也有一個名稱屬性

請注意,我爲您的ParentViewModel添加了EventHandler。當更新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只是有一個名稱屬性。

public class ChildViewModel : ViewModelBase 
    { 
     private string _childName; 

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

    } 

的ViewModelBase剛剛更新UI

public class ViewModelBase : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     public void OnPropertyChanged(string propName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 

      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propName)); 
      } 
     } 
    } 

enter image description here

enter image description here

enter image description here

+1

這適用於新事件處理程序。欣賞你花費的時間。做得好 – TableCreek