2012-07-04 2 views
1

MVVM에서 UI를 만들었으나 이제는 SelectedItems를 얻는 데 주력했습니다. 내 XAML을 수정하고 샘플을 제공하여 ViewModel 클래스를 얻는 방법을 알려주십시오.DataGrid.SelectedItems MVVM

<xcdg:DataGridControl Name="ResultGrid" ItemsSource="{Binding Results}" Height="295" HorizontalAlignment="Left" Margin="6,25,0,0" VerticalAlignment="Top" Width="1041" ReadOnly="True"> 
        <xcdg:DataGridControl.View> 
         <xcdg:TableflowView UseDefaultHeadersFooters="False"> 
          <xcdg:TableflowView.FixedHeaders> 
           <DataTemplate> 
            <xcdg:ColumnManagerRow /> 
           </DataTemplate> 
          </xcdg:TableflowView.FixedHeaders> 
         </xcdg:TableflowView> 
        </xcdg:DataGridControl.View> 
       </xcdg:DataGridControl> 
+0

단지 선택한 항목을 가져 오시겠습니까, 아니면 viewmodel에서 selecteditems를 설정 하시겠습니까? 선택이 이루어 지거나 선택이 이루어지기 직전에 선택 항목을 얻고 싶을 때가 있습니다. 버튼 명령이 호출 되었습니까? – blindmeis

답변

1

다중 선택을 원하고 그 선택된 항목을 얻고 싶다면 더 많은 일이있을 것입니다. 선택한 항목을 저장 하시겠습니까? 그리고 몇 가지 작업 (예 : 버튼 클릭 또는 그와 비슷한 작업)이 수행되면 selectedItems를 사용하고 해당 항목을 사용하고 싶습니까?

Get SelectedItems From DataGrid Using MVVM

그것은이 실버 라이트를 위해 설계되었습니다 미국, 그러나 너무 MVVM와 WPF에서 작동합니다 :

여기에 사용할 수의 좋은 예입니다. 당신은 데이터 그리드에/세트 selectedItems를 얻을 행동을 첨부 사용할 수 있습니다

Get Selected items in a WPF datagrid

3

:

아마도이 더 간단 접근 방식입니다.

메트로 앱에서 비슷한 문제가 발생했습니다. 직접 작성해야했습니다.

다음은

내가 지하철 앱을 작성했다하더라도

http://www.codeproject.com/Articles/412417/Managing-Multiple-selection-in-View-Model-NET-Metr

이 같은 솔루션은 WPF/실버 라이트에 적용 할 수있는 링크를합니다.

public class MultiSelectBehavior : Behavior<ListViewBase> 
     { 
      #region SelectedItems Attached Property 
      public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.Register(
       "SelectedItems", 
       typeof(ObservableCollection<object>), 
       typeof(MultiSelectBehavior), 
       new PropertyMetadata(new ObservableCollection<object>(), PropertyChangedCallback)); 

      #endregion 

      #region private 
      private bool _selectionChangedInProgress; // Flag to avoid infinite loop if same viewmodel is shared by multiple controls 
      #endregion 

      public MultiSelectBehavior() 
      { 
       SelectedItems = new ObservableCollection<object>(); 
      } 

      public ObservableCollection<object> SelectedItems 
      { 
       get { return (ObservableCollection<object>)GetValue(SelectedItemsProperty); } 
       set { SetValue(SelectedItemsProperty, value); } 
      } 

      protected override void OnAttached() 
      { 
       base.OnAttached(); 
       AssociatedObject.SelectionChanged += OnSelectionChanged; 
      } 

      protected override void OnDetaching() 
      { 
       base.OnDetaching(); 
       AssociatedObject.SelectionChanged -= OnSelectionChanged; 
      } 

      private static void PropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs args) 
      { 
       NotifyCollectionChangedEventHandler handler = (s, e) => SelectedItemsChanged(sender, e); 
       if (args.OldValue is ObservableCollection<object>) 
       { 
        (args.OldValue as ObservableCollection<object>).CollectionChanged -= handler; 
       } 

       if (args.NewValue is ObservableCollection<object>) 
       { 
        (args.NewValue as ObservableCollection<object>).CollectionChanged += handler; 
       } 
      } 

      private static void SelectedItemsChanged(object sender, NotifyCollectionChangedEventArgs e) 
      { 
       if (sender is MultiSelectBehavior) 
       { 
        var listViewBase = (sender as MultiSelectBehavior).AssociatedObject; 

        var listSelectedItems = listViewBase.SelectedItems; 
        if (e.OldItems != null) 
        { 
         foreach (var item in e.OldItems) 
         { 
          if (listSelectedItems.Contains(item)) 
          { 
           listSelectedItems.Remove(item); 
          } 
         } 
        } 

        if (e.NewItems != null) 
        { 
         foreach (var item in e.NewItems) 
         { 
          if (!listSelectedItems.Contains(item)) 
          { 
           listSelectedItems.Add(item); 
          } 
         } 
        } 
       } 
      } 

      private void OnSelectionChanged(object sender, SelectionChangedEventArgs e) 
      { 
       if (_selectionChangedInProgress) return; 
       _selectionChangedInProgress = true; 
       foreach (var item in e.RemovedItems) 
       { 
        if (SelectedItems.Contains(item)) 
        { 
         SelectedItems.Remove(item); 
        } 
       } 

       foreach (var item in e.AddedItems) 
       { 
        if (!SelectedItems.Contains(item)) 
        { 
         SelectedItems.Add(item); 
        } 
       } 
       _selectionChangedInProgress = false; 
      } 
     } 
0

모든 읽기 전용 모음 또는 비 종속성 속성을 연결하기위한 연결 동작을 만드는 것은 많은 작업을 필요로합니다. 간단한 해결책은 뷰를 사용하여 뷰 모델에 참조를 전달하는 것입니다.

Private ReadOnly Property ViewModel As MyViewModel 
    Get 
     Return DirectCast(DataContext, MyViewModel) 
    End Get 
End Property 

Private Sub MyView_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded 
    If ViewModel.SelectedItems Is Nothing Then 
     ViewModel.SelectedItems = MyDataGrid.SelectedItems 
    End If 
End Sub