2012-05-23 2 views
4

Caliburn.Micro를 사용하는 WPF 응용 프로그램이 있습니다.Caliburn.Micro를 사용하여 DataGrid에서 여러 레코드 선택

데이터 격자는 속성의 selectedItem = "{바인딩 경로 = SelectedUsageRecord}"당신이 볼 수 있듯이

, selectedItem가이 SelectedUsageRecord 속성에 바인딩되어 있습니다. 하지만 여러 레코드 선택을 처리 할 수 ​​있어야합니다. 여러 레코드를 컬렉션 속성에 바인딩 할 수 있습니까? "SelectedItems"와 같은 것이 보이지 않습니다 ... 고마워요.

+1

? 저는 Telerik DataGrid를 사용하여 ContainerBinding을 할 수 있으므로 IsSelected를 Customers 컬렉션의 Customer에 바인딩 할 수 있습니다. 거기에서 선택한 항목을 쉽게 찾을 수 있습니다. –

답변

6

다음은 내가 당신과 같은 시나리오를 밟은 후 한 일입니다. 짧게는 선택 변경 이벤트를 직접 처리하고 이벤트 인수에서 선택한 행을 가져옵니다. "Row"소스 컬렉션을 각각 RowViewModel로 가정하고 "_selectedRows"컬렉션을 가정합니다.

<DataGrid RowsSource="{Binding Rows}" x:Name="Rows"     
      SelectionMode="Extended" SelectionUnit="FullRow"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged"> 
      <cal:ActionMessage MethodName="SelectedRowsChangeEvent"> 
       <cal:Parameter Value="$eventArgs" /> 
      </cal:ActionMessage> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</DataGrid> 
public void SelectedRowsChangeEvent(SelectionChangedEventArgs e) 
{ 
    foreach (var addedRow in e.AddedRows) 
    { 
     _selectedRows.Add(addedRow as RowViewModel); 
    } 

    foreach (var removedRow in e.RemovedRows) 
    { 
     _selectedRows.Remove(removedRow as RowViewModel); 
    } 
} 
2

난 그냥 내 솔루션을 게시하고 싶었다. Caliburn 마이크로에서는 명명 규칙을 준수하는 한 소스를 설정할 필요가 없습니다.

XAML

<DataGrid x:Name="Rows" SelectionMode="Extended" cal:Message.Attach="[Event SelectionChanged] = [Row_SelectionChanged($eventArgs)]"> 

C#을 사용하고있는 데이터 그리드

public List<MyObject> Rows { get; set; } 

public MyObject SelectedRow { get; set; } //Will be set by Caliburn Micro. No need to use "SelectedItem={...}" 

List<MyObject> _selectedObjects = new List<MyObject>();  

public void Row_SelectionChanged(SelectionChangedEventArgs obj) 
{ 
    _selectedObjects.AddRange(obj.AddedItems.Cast<MyObject>()); 
    obj.RemovedItems.Cast<MyObject>().ToList().ForEach(w => _selectedObjects.Remove(w)); 
} 
관련 문제