2011-09-23 28 views
2

我有我的WPF應用程序一個gridview的XAML其中看起來像這樣設置的GridView的selectedItems屬性在WPF:如何使用MVVM

<ListView SelectionMode="Extended" ItemsSource="{Binding AllPartTypes}" 
     local:DataGridService.SelectedItems="{Binding Path=SelectedPartTypes, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
     <ListView.View> 
      <GridView> 
       some columns... 
      </GridView> 
     </ListView.View> 
    </ListView> 

這裏是附加的行爲我使用獲取所選項目:

public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.RegisterAttached(
      "SelectedItems", 
      typeof(IList), 
      typeof(DataGridService), 
      new UIPropertyMetadata(new List<object>() as IList, OnSelectedItemsChanged)); 

     static SelectionChangedEventHandler GetSelectionChangedHandler(DependencyObject obj) 
     { 
      return (SelectionChangedEventHandler)obj.GetValue(SelectionChangedHandlerProperty); 
     } 
     static void SetSelectionChangedHandler(DependencyObject obj, SelectionChangedEventHandler value) 
     { 
      obj.SetValue(SelectionChangedHandlerProperty, value); 
     } 
     static readonly DependencyProperty SelectionChangedHandlerProperty = 
      DependencyProperty.RegisterAttached("SelectionChangedHandler", typeof(SelectionChangedEventHandler), 
      typeof(DataGridService), new UIPropertyMetadata(null)); 

     //d is MultiSelector (d as ListBox not supported) 
     static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs args) 
     { 
      if (GetSelectionChangedHandler(d) != null) 
       return; 

      if (d is MultiSelector)//DataGrid 
      { 
       MultiSelector multiselector = d as MultiSelector; 
       SelectionChangedEventHandler selectionchanged = null; 
       foreach (var selected in (d as DataGrid).SelectedItems) // GetSelectedItems(d) as IList) 
        multiselector.SelectedItems.Add(selected); 

       selectionchanged = (sender, e) => 
       { 
        SetSelectedItems(d, multiselector.SelectedItems); 
       }; 
       SetSelectionChangedHandler(d, selectionchanged); 
       multiselector.SelectionChanged += GetSelectionChangedHandler(d); 
      } 
      else if (d is ListBox) 
      { 
       ListBox listbox = d as ListBox; 
       SelectionChangedEventHandler selectionchanged = null; 

       selectionchanged = (sender, e) => 
       { 
        SetSelectedItems(d, listbox.SelectedItems); 
       }; 
       SetSelectionChangedHandler(d, selectionchanged); 
       listbox.SelectionChanged += GetSelectionChangedHandler(d); 
      } 
     } 

     public static IList GetSelectedItems(DependencyObject obj) 
     { 
      return (IList)obj.GetValue(SelectedItemsProperty); 
     } 

     public static void SetSelectedItems(DependencyObject obj, IList value) 
     { 
      obj.SetValue(SelectedItemsProperty, value); 
     } 

這適用於在用戶單擊按鈕或某物時獲取viewmodel中的選定項目。我的問題是,當屏幕加載時,我需要突出顯示先前選擇的項目。我沒有成功嘗試在虛擬機的構造函數中設置'SelectedPartTypes'屬性,假設雙向綁定將處理它。有沒有簡單的方法來顯示控件加載時選擇哪些項目?

回答

2

你不能綁定ListBoxItem樣式中的IsSelected屬性嗎?

<Style TargetType="ListBoxItem"> 
    <Setter Property="IsSelected" Value="{Binding IsSelected}" /> 
</Style> 

如果您的數據對象不具有的屬性來跟蹤選擇,您可能需要使用轉換器返回true,如果當前對象是內SelectedPartTypes

+0

我想這個......我增加了一個將IsSelected屬性設置爲我的PartType對象,並將其設置爲true以顯示每個選定對象。當屏幕加載時,GridView中不會顯示任何內容,無論IsSelected是true還是false。 – drowned

+0

@drowned沒有'local:DataGridService.SelectedItems'綁定工作嗎? – Rachel

+0

是的,它的作品。我不敢相信我在之前找到用於處理多個選定項目的瘋狂附加行爲選項時並未遇到此解決方案。謝謝。 – drowned