2016-06-04 17 views
1

이상한 문제가 있습니다. 이유가있어서 ItemsSourceMultiBinding으로 바인딩하려는 DataGrid이 있습니다. DataTable에 대한 간단한 바인딩을 사용하는 것이 효과적이지만,이 기능을 멀티 바인딩으로 사용할 수는 없습니다.DataGrid ItemsSource를 멀티 바인딩으로 바인딩 할 수 없습니다. 간단한 바인딩이 잘 작동합니다.

는 간단히 말해이 정말 작동하지 않는 동안 작품 아래의 마크 업 및 데이터 테이블

<DataGrid Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" AutoGenerateColumns="True" IsReadOnly="True"> 
    <DataGrid.ItemsSource> 
     <Binding Path="Mock.Value" Converter="{StaticResource CollectionToDataTableConverter}"></Binding> 
    </DataGrid.ItemsSource> 
</DataGrid> 

... 렌더링은 - 아무에게 CollectionToDataTableConverter 모두 IValueConverterIMultiValueConverter를 구현하는

<DataGrid Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" AutoGenerateColumns="True" IsReadOnly="True"> 
    <DataGrid.ItemsSource> 
     <MultiBinding Converter="{StaticResource CollectionToDataTableConverter}"> 
      <Binding Path="Mock.Value" /> 
     </MultiBinding> 
    </DataGrid.ItemsSource> 
</DataGrid> 

공지 사항을 렌더링하지 단순히 값을 전달합니다.

public class CollectionToDataTableConverter : IMultiValueConverter, IValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     return values?.FirstOrDefault(); 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value; 
    } 
    // ... 
} 

보기 모델에 Mock.Value 속성이 존재하며 간단 함은 DataTable입니다. 또한 디버깅은 두 경우 모두 변환기가 적절한 값을 반환한다는 것을 증명합니다.

어떤 일이 벌어지고 있는지 알고 계십니까?

감사합니다.

답변

2

우선 DataTableIEnumerable을 구현하지 않으므로 DataGrid.ItemsSource 속성에는 유효하지 않습니다. 그냥 출력 창에 System.Windows.Data Error: 5을 볼 수 있습니다. DataTable에 바인딩 할 때

둘째, 당신은 쉽게 DataView 객체가 실제로 DataGrid.ItemsSource의 최종 값을 확인할 수 있습니다 (정확하게는 DataTable.DefaultView 속성 값이다). -

는 이제 MultiBinding 일을 할 수있는 몇 가지 방법이 있습니다 여기에 몇 가지있다 :

  • 돌아 가기 DataTable.DefaultView보다는 DataTable.DefaultView-
  • 바인드 직접 변환에서 DataTable 자체 (Mock.Value.DefaultView로 바인딩 경로를 사용)
  • DataTable에서 파생되는 클래스를 만들고 IEnumerable (구현에 GetEnumerator 반환)을 구현하고대신 해당 클래스를 사용하십시오. 나도 몰라 - 하나를 사용하는 경우 그렇지 않은 경우 이유는 자동적으로 작업 MultiBinding를 사용하거나하지 않을 경우 수행하는 방법에 대한 설명에 관해서는

. WPF의 형식 변환 메커니즘이라고 생각했지만 기본 변환기는 DataTable도 아니고 IEnumerable도 변환을 수행 할 수 없으므로 그렇지 않습니다. 아마도 Binding 클래스는 MultiBinding과 관련하여 몇 가지 특별한 기능을 가지고 있습니다.

+0

답변 해 주셔서 감사합니다. 글쎄, 가장 쉬운 방법은'.DefaultView'를 반환하는 것이다. 그리고 이것은 분명히 다중 바인딩이 올바르게 작동하게합니다. 정말 좋은 캐치 감사합니다! – patryk