2015-04-22 12 views
0

我有一個關於像下面的例子一樣的列表視圖設置的問題。當我點擊擴展器頭部下面的按鈕時,我也希望選擇該項目,但是我所看到的是按鈕命令確實有效,選中的項目仍然是選擇的上一個項目,而不是我的按鈕是項目如何在單擊按鈕時選擇項目?點擊未被選中的listviewitem中的一個按鈕,並獲取選定的項目

我試圖設置一個這樣的ControlTemplate,但它沒有奏效。

<Style TargetType="{x:Type ListViewItem}"> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListViewItem}"> 
        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
          <Setter Property="IsSelected" Value="True" /> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 


<ListView ItemsSource="{Binding MyItemSource, 
             Mode=TwoWay}" 
        SelectedItem="{Binding MySelectedItem, 
             Mode=TwoWay}"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <Expander IsExpanded="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListViewItem}}, Path=IsSelected}"> 
       <Expander.Header> 
        <Button Command={Binding MyCommand}>Click Me</Button> 
       </Expander.Header> 
       <!-- content here --> 
      </Expander> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

回答

1

我建議在主視圖模型這需要將被選擇作爲參數的項定義的命令SelectItem。然後,此命令的執行方法可以設置MySelectedItem屬性,將項目ViewModel上的屬性IsSelected設置爲true,並調用對項目本身的所有進一步操作(即現在由MyCommand執行的操作)。隨着視圖模型和一個乾淨的綁定,您的選擇邏輯甚至不需要使用ListView可言,但能堅持到普通ItemsControl

的XAML則是這樣的:

<ItemsControl ItemsSource="{Binding MyItemSource}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Expander IsExpanded="{Binding IsSelected}"> 
       <Expander.Header> 
        <Button Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ItemsControl}, Path=DataContext.SelectItem}" 
          CommandParameter="{Binding"}>Click Me</Button> 
       </Expander.Header> 
       <!-- content here --> 
      </Expander> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

的MainViewModel會是這個樣子:

public class MainViewModel : INotifyPropertyChanged 
{ 
    public ObservableCollection<ItemViewModel> MyItemsSource { get; private set; } 

    public ItemViewModel SelectedItem { get... set... } 

    public ICommand SelectItem { get; private set; } 

    ctor()... 

    private void ExecuteSelectItem(ItemViewModel item) 
    { 
     SelectedItem = item; 
     foreach (var i in MyItemsSource) i.IsSelected = false; 
     item.IsSelected = true; 
     item.DoSomething(); 
    } 
} 

我一直覺得它的方式更容易使用ItemsControl工具選擇邏輯的幾行自己,而不是處理一個0123的選擇凌亂綁定。在我看來,實現自定義選擇行爲(多個項目,只允許某些組合等)是非常直觀的。您可以使用IsSelected屬性輕鬆地應用選定項目的自定義樣式。

+0

這個偉大的工程,大加讚賞,而現在我看到它,我同意,要容易得多。 – gwm

0

你可以嘗試這樣的事情在您的視圖模型,添加if語句在二傳手:

private object _mySelectedItem; 
    public object MySelectedItem 
    { 
     get { return _mySelectedItem; } 
     set 
     { 
      if (_mySelectedItem != value && value != null) 
      { 
       _mySelectedItem = value; 
       OnPropertyChanged("MySelectedItem"); 
      } 
     } 
    } 
相關問題