2010-05-26 7 views
1

"SelectedGridItems"속성이있는 WPFToolkit-DataGrid 및 View-Model 클래스가 있습니다 WPFToolkit-Datagrid의 selectedItem 속성을 내 ViewModel 속성 ("SelectedGridItems")에 바인딩하려면 어떻게해야합니까?WPFToolkit-Datagrid의 selectedItem 속성을 내 viewmodel 속성에 바인딩하려면 어떻게해야합니까?

+0

당신이 SelectedGridItems (복수형)를 썼다고 생각하면 DataGrid에 여러 항목을 선택하여 바인딩한다고 가정합니다. 그리드의 선택된 (단일) 행만 바인딩하려는 경우 매우 쉽습니다. 여러 개를 선택하려면 더 복잡합니다. – ThomasAndersson

+0

여러 항목을 바인딩해야합니다. 하지만 단품으로 어떻게 할 수 있는지 말해 줄 수 있어요? 내 실제 요구 사항은 : http : //stackoverflow.com/questions/2910873/how-to-access-data-from-another-datatemplate-in-wpf. 버튼을 클릭하면 선택한 항목을 매개 변수로 전달하려고했습니다. 내가이 대기열에 대한 답변을 얻지 못했기 때문에 나는 wud가 선택된 항목을 뷰 모델 속성으로 설정했다고 생각했습니다. – Relativity

답변

3

는 인 selectionchanged 이벤트에 후크 연결된 속성입니다 ListBox의 선택된 항목 목록을 ViewModel에 채 웁니다. "ListBox"를 "DataGrid"로 간단히 변경할 수 있습니다.

http://marlongrech.wordpress.com/2009/06/02/sync-multi-select-listbox-with-viewmodel/

편집 : 데이터 그리드 버전에 대한 소스 코드를 추가 ... XAML에서

/// <summary> 
/// Attached property that stores the selected items of a DataGrid 
/// </summary> 
public static class DataGridService 
{ 
    #region SelectedItems 

    /// <summary> 
    /// SelectedItems Attached Dependency Property 
    /// </summary> 
    public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.RegisterAttached(
     "SelectedItems", 
     typeof(IList), 
     typeof(DataGridService), 
     new FrameworkPropertyMetadata((IList)null, new PropertyChangedCallback(OnSelectedItemsChanged))); 

    /// <summary> 
    /// Gets the SelectedItems property. 
    /// </summary> 
    /// <param name="d"><see cref="DependencyObject"/> to get the property from</param> 
    /// <returns>The value of the SelectedItems property</returns> 
    public static IList GetSelectedItems(DependencyObject d) 
    { 
     return (IList)d.GetValue(SelectedItemsProperty); 
    } 

    /// <summary> 
    /// Sets the SelectedItems property. 
    /// </summary> 
    /// <param name="d"><see cref="DependencyObject"/> to set the property on</param> 
    /// <param name="value">value of the property</param> 
    public static void SetSelectedItems(DependencyObject d, IList value) 
    { 
     d.SetValue(SelectedItemsProperty, value); 
    } 

    /// <summary> 
    /// Handles changes to the SelectedItems property. 
    /// </summary> 
    /// <param name="d"><see cref="DependencyObject"/> that fired the event</param> 
    /// <param name="e">A <see cref="DependencyPropertyChangedEventArgs"/> that contains the event data.</param> 
    private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var grid = (DataGrid)d; 
     ReSetSelectedItems(grid); 
     grid.SelectionChanged += delegate 
     { 
     ReSetSelectedItems(grid); 
     }; 
    } 

    /// <summary> 
    /// Sets the selected items collection for the specified <see cref="DataGrid"/> 
    /// </summary> 
    /// <param name="grid"><see cref="DataGrid"/> to use for setting the selected items</param> 
    private static void ReSetSelectedItems(DataGrid grid) 
    { 
     IList selectedItems = GetSelectedItems(grid); 
     selectedItems.Clear(); 
     if (grid.SelectedItems != null) 
     { 
     foreach (var item in grid.SelectedItems) 
     { 
      selectedItems.Add(item); 
     } 
     } 
    } 

    #endregion 
} 

:

<tk:DataGrid ... local:DataGridService.SelectedItems="{Binding Path=MyCollection}" SelectionMode="Extended"> 

는 "MyCollection는"당신의 ViewModel의 ObservableCollection에 있어야한다 .

+0

안녕하세요, 이것은 매우 유용한 링크입니다 ... 만난 적이있는 한 가지 문제는 DataGrid에 "selectedItems"라는 속성이 없습니다 ... "selecteditem"속성 만 사용하고 있습니다. 우리는 동일한 것을 극복하기 위해 무언가를 붙일 수 있습니까? 그렇다면 mvvm 모델에서 볼 수 있습니까 ... 뷰 모델에서 연결된 속성을 의미합니까? – Relativity

+0

DataGrid에는 SelectedItems 속성이 있습니다. http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.selecteditems(VS.95).aspx 원본을 포함하도록 답변을 업데이트했습니다. 코드를 DataGrid 버전의 속성에 추가합니다. –

+0

나는 이것을 체크했다. 그러나 문제는 "OnSelectedItemsChanged"가 호출되지 않는다는 것이다. : ( – Relativity

1

이 코드는 WPF4의 DataGrid 용 코드입니다. 현재로서는 Toolkit에 액세스 할 수 없지만 다른 코드는 아닙니다. 데이터 그리드에서 단일 행을 바인딩에 대한

:

<DataGrid ItemsSource="{Binding ViewModelCollectionProperty}" 
SelectedItem="{Binding Path=ViewModelProperty}"> 

</DataGrid> 

가 선택한 여러 행을 결합하려면, 당신의 최선의 방법은 데이터 바인딩 할 수 있습니다 선택된 항목의 컬렉션을 유지 연결된 속성을 만들 아마 뷰 모델.

편집 -

아래에 추가 링크는 당신이 원하는 것을 매우 유사하고 연결된 속성을 만드는 방법에 대한 기사 여기를 참조하십시오 : 여기 http://alexshed.spaces.live.com/Blog/cns!71C72270309CE838!149.entry

+0

MVVM 패턴을 따르고 있습니다 ... 그래서 view-codebehind 파일에 아무것도 쓸 수 없습니다. 1. WPFToolkit 컨트롤에 속성을 첨부 할 수 있습니까? 2. XAMl에서 attach 속성을 사용할 수 있습니까 (코드 숨김에서 RergisterAttached 사용하지 않음) – Relativity

+0

Anish, 내가 편집 한 링크를 살펴보십시오. – ThomasAndersson

관련 문제