2017-02-15 109 views
0

我有一組類,它包含的項目列表和標題:選擇多個列表項目

public class MyGroup {  
    public MyGroup(string _header){ 
     header = _header; 
    } 

    protected string header = ""; 
    public string Header 
    { 
     get { return header; } 
    } 

    protected List<MyGroupItem> item = new List<MyGroupItem>(); 
    public List<MyGroupItem> Item 
    { 
     get { return item; } 
    } 
} 

public class MyGroupItem {  
    public MyGroupItem(string _name, double _multiplier){ 
     name = _name; 
     multiplier = _multiplier; 
    } 

    protected double multiplier = 1.0; 

    protected string name = ""; 
    public string Name 
    { 
     get { return name; } 
    } 
} 

到目前爲止好。在我的主類,我組的觀察的集合,我填充它是這樣的:

protected ObservableCollection<MyGroup> groups = new ObservableCollection<MyGroup>(); 
public ObservableCollection<MyGroup> Groups 
{ 
    get { return groups; } 
} 

protected MyGroupItem currentItem; 
public MyGroupItem CurrentItem 
{ 
    get { return currentItem; } 
    set 
    { 
     if (currentItem== value) return; 
     currentItem= value; 
     NotifyPropertyChanged("CurrentItem"); 
    } 
} 

.... 

var GroupA = new MyGroup("Group A"); 
GroupA.MyGroupItem.Add("Item 1", 1.0); 
Groups.Add(GroupA); 

currentItem = GroupA.MyGroupItem[0]; 

所有上述的簡單顯示瞭如何已經設置我的課和觀察的名單。現在,我切換到xaml。

<ItemsControl ItemsSource="{Binding Path=Groups}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Background="Transparent" ClipToBounds="True" Orientation="Vertical"></StackPanel> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <ItemsControl.ItemTemplate> 
     <DataTemplate DataType="{x:Type local:MyGroup}"> 
      <StackPanel> 
       <TextBlock Text="{Binding Path=Header}"></TextBlock> 
       <ListView ItemsSource="{Binding Path=MyGroupItem}" SelectedItem="{Binding Path=DataContext.CurrentItem, ElementName=ControlRoot}"> 
        <ListView.ItemTemplate> 
         <DataTemplate DataType="local:MyGroupItem"> 
          <TextBlock Text="{Binding Path=Name}"></TextBlock> 
         </DataTemplate> 
        </ListView.ItemTemplate> 
       </ListView> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

所以,基本上我有一個ItemControl顯示多個項目列表。控件應該爲組的名稱放置標題,然後顯示該組中特定項目的列表視圖。佈局完美...但是,問題來了,當我處理選定項目。基本上,列表視圖允許我在多個組中選擇一個項目......這意味着我可能在任何給定時間選擇多個項目。例如,假設我選擇了組A中的第一個項目,但是,我將選擇更改爲組B中的第二個項目。因爲組B是一個單獨的列表,它允許我激活該項目......但它不會取消選擇組A中的項目。我想要的是這個多列表組作爲單個列表。這可能嗎?我是否需要單獨設置SelectionChanged事件?如果是的話,我該如何確定選擇何時被更改,以便清除所有列表中的選定項目,並且只顯示用戶剛選擇的正確項目?

回答

1

你應該在你的視圖模型類中處理這個。

如果添加一個屬性來保存每個組的MyGroup類的所選項目並實現INotifyPropertyChanged界面,你可以處理CollectionChanged事件Groups集合中的視圖模型類的設置CurrentItem屬性,並在同時通過在此事件處理程序中將其設置爲null來清除其他組的SelectedItem屬性。

下面是一個例子給你。

MyGroup.cs:

public class MyGroup : INotifyPropertyChanged 
{ 
    public MyGroup(string _header) 
    { 
     header = _header; 
    } 

    protected string header = ""; 
    public string Header 
    { 
     get { return header; } 
    } 

    protected List<MyGroupItem> item = new List<MyGroupItem>(); 
    public List<MyGroupItem> Item 
    { 
     get { return item; } 
    } 

    private MyGroupItem _item; 
    public MyGroupItem SelectedItem 
    { 
     get { return _item; } 
     set { _item = value; NotifyPropertyChanged(); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

} 

MyGroupItem.cs:

public class MyGroupItem 
{ 
    public MyGroupItem(string _name, double _multiplier) 
    { 
     name = _name; 
     multiplier = _multiplier; 
    } 

    protected double multiplier = 1.0; 

    protected string name = ""; 
    public string Name 
    { 
     get { return name; } 
    } 
} 

視圖模型:

public class Window1ViewModel : INotifyPropertyChanged 
{ 
    public Window1ViewModel() 
    { 
     groups.CollectionChanged += (s, e) => 
     { 
      if (e.NewItems != null) 
      { 
       foreach (object item in e.NewItems) 
       { 
        (item as INotifyPropertyChanged).PropertyChanged 
         += new PropertyChangedEventHandler(item_PropertyChanged); 
       } 
      } 

      if (e.OldItems != null) 
      { 
       foreach (object item in e.OldItems) 
       { 
        (item as INotifyPropertyChanged).PropertyChanged 
         -= new PropertyChangedEventHandler(item_PropertyChanged); 
       } 

      }; 
     }; 

     var GroupA = new MyGroup("Group A"); 
     GroupA.Item.Add(new MyGroupItem("Item 1", 1.0)); 
     GroupA.Item.Add(new MyGroupItem("Item 2", 1.0)); 
     GroupA.Item.Add(new MyGroupItem("Item 3", 1.0)); 
     Groups.Add(GroupA); 

     var GroupB = new MyGroup("Group B"); 
     GroupB.Item.Add(new MyGroupItem("Item 1", 1.0)); 
     GroupB.Item.Add(new MyGroupItem("Item 2", 1.0)); 
     GroupB.Item.Add(new MyGroupItem("Item 3", 1.0)); 
     Groups.Add(GroupB); 

     currentItem = GroupA.Item[0]; 
    } 

    private bool _handle = true; 
    private void item_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     if (!_handle) 
      return; 

     MyGroup group = sender as MyGroup; 
     CurrentItem = group.SelectedItem; 

     //clear the selection in the other groups: 
     _handle = false; 
     foreach (MyGroup g in Groups) 
      if (g != group) 
       g.SelectedItem = null; 
     _handle = true; 
    } 

    protected ObservableCollection<MyGroup> groups = new ObservableCollection<MyGroup>(); 
    public ObservableCollection<MyGroup> Groups 
    { 
     get { return groups; } 
    } 

    protected MyGroupItem currentItem; 
    public MyGroupItem CurrentItem 
    { 
     get { return currentItem; } 
     set 
     { 
      if (currentItem == value) return; 
      currentItem = value; 
      NotifyPropertyChanged("CurrentItem"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

查看:

<ItemsControl ItemsSource="{Binding Path=Groups}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Background="Transparent" ClipToBounds="True" Orientation="Vertical"></StackPanel> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate DataType="{x:Type local:MyGroup}"> 
      <StackPanel> 
       <TextBlock Text="{Binding Path=Header}"></TextBlock> 
       <ListView ItemsSource="{Binding Path=Item}" 
            SelectedItem="{Binding SelectedItem}"> 
        <ListView.ItemTemplate> 
         <DataTemplate DataType="local:MyGroupItem"> 
          <TextBlock Text="{Binding Path=Name}"></TextBlock> 
         </DataTemplate> 
        </ListView.ItemTemplate> 
       </ListView> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

這工作完美!感謝徹底的迴應! – andyopayne

相關問題