2013-04-17 3 views
0

모든, 나는런타임에 데이터 그리드에 데이터를 바인딩하는 방법을

private ObservableCollection<TestClass> _testData = new ObservableCollection<TestClass>(); 
public ObservableCollection<TestClass> TestData 
{ 
    get { return _testData; } 
    set { _testData = value; } 
} 

로 정의 된 테스트 데이터와 함께 작동하고

<DataGrid x:Name="dataGrid" ItemsSource="{Binding TestData}".../> 

을 통해 디자인 타임에 바인딩되는 몇 가지 테스트 코드를 나는

dataGrid.ItemsSource = BuildDataGridColumns(cultureDict).Tables[0].AsDataView(); 

를 통해 실행 시간에 채워 가져옵니다 DataGrid을 만들었습니다

private DataSet BuildDataGridColumns(Dictionary<string, string> cultureDict, 
            DataTable additionalDt = null) 
{ 
    // ... 
} 

그러나 위의 코드는 테스트 데이터 작업에 사용 된 그리드 비주얼을 더 이상 업데이트하지 않기 때문에 더 이상 ItemsSource="{Binding TestData}"이 존재하지 않으므로 발생하지 않습니다. DataGrid의 세포에 TextBox에와 있다는 삽입 된 텍스트를 결합하기로되어 XAML은 다음과 같습니다

<DataGrid x:Name="dataGrid" 
      local:DataGridTextSearch.SearchValue="{Binding ElementName=searchBox, Path=Text, UpdateSourceTrigger=PropertyChanged}" 
      AlternatingRowBackground="Gainsboro" AlternationCount="2" HorizontalAlignment="Stretch" 
      VerticalAlignment="Stretch"> 
    <DataGrid.Resources> 
     <local:SearchValueConverter x:Key="searchValueConverter" /> 
     <Style TargetType="{x:Type DataGridCell}"> 
     <Setter Property="local:DataGridTextSearch.IsTextMatch"> 
      <Setter.Value> 
       <MultiBinding Converter="{StaticResource searchValueConverter}"> 
        <Binding RelativeSource="{RelativeSource Self}" Path="Content.Text" /> 
        <Binding RelativeSource="{RelativeSource Self}" Path="(local:DataGridTextSearch.SearchValue)" /> 
       </MultiBinding> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <Trigger Property="local:DataGridTextSearch.IsTextMatch" Value="True"> 
       <Setter Property="Background" Value="Orange" /> 
      </Trigger> 
     </Style.Triggers> 
     </Style> 
    </DataGrid.Resources> 
    <DataGrid.CellStyle> 
     <Style TargetType="DataGridCell" > 
     <Style.Triggers> 
      <Trigger Property="IsSelected" Value="True"> 
       <Setter Property="Background" Value="#FF007ACC"/> 
       <Setter Property="Foreground" Value="White"/> 
      </Trigger> 
     </Style.Triggers> 
     </Style> 
    </DataGrid.CellStyle> 
</DataGrid> 

내 질문은,

DataGrid과 동일한 바인딩을 런타임에 만드는 데이터 세트에 어떻게 만들 수 있습니까?

누군가가 이유는 내 데이터가 INotifyCollectionChanged 인터페이스를 구현하지 않는 것을 건의했다, 그러나, 데이터의 변수 특성으로, 나는 런타임에 DataGrid에 데이터를로드 할 수 있습니다.

어떻게 데이터의 구조를 변경할 수있는 경우 INotifyPropertyChanged를 구현하는 클래스로 DataGrid이 데이터를 바인딩 할 수 있습니다?

감사합니다.

답변

1

저는 Blam이 옳다고 생각합니다. (미안하지만 아직 코멘트를 추가 할 권한이 없습니다.) 테스트 코드에서 INotifyPropertyChanged를 구현하는 ObservableCollection을 사용합니다. DataGrid는 해당 컬렉션에 대한 변경 사항을 선택합니다. 실제 코드에서 ObservableCollection을 사용하고이를 통해 데이터를 업데이트하여 DataGrid.ItemsSource를 통해 직접 바인딩하는 것이 아니라 바인딩 된 DataGrid에서 선택하도록 고려해야합니다.

이 페이지의 대답 접근 방식이 도움이 될 수 있습니다 : 결국 https://stackoverflow.com/a/1581588/1082026

, 당신의 코드는 다음과 같은 (참고 보일 수 있습니다, 당신은 거울 것이다 클래스 있는 DataItem를 정의해야합니다 당신의 데이터 그리드에 대한 관심이 특히 속성을 사용하여 데이터 집합의 DataTable에있는 행) :

private ObservableCollection<DataItem> dataItems= new ObservableCollection<DataItem>(); 
public ObservableCollection<DataItem> DataItems 
{ 
    get { return this.dataItems; } 
    set 
    { 
     this.dataItems = value; 
     base.OnPropertyChanged("DataItems"); 
    } 
} 

이 바인딩

,536으로
<DataGrid x:Name="dataGrid" ItemsSource="{Binding TestData}".../> 

그리고 당신은 추가()로 처리하고) (제거하지 않으려는 경우, 이것은 당신이 컬렉션 설정하는 방법이 될 것이다 :

IList<DataItem> items = BuildDataGridColumns(cultureDict).Tables[0].AsDataView(); 
this.DataItems = new ObservableCollection<DataItem>(items); 

... 

private IList<DataItem> BuildDataGridColumns(Dictionary<string, string> cultureDict, 
            DataTable additionalDt = null) 
{ 
    // ... here create a list of DataItems from your table, and return it. 
} 

희망하는 데 도움이!

+0

이것은 좋은 대답이며 내가 깨닫고 어젯밤 일을 시작한 것입니다. 시간 내 주셔서 대단히 감사합니다 ... – MoonKnight

관련 문제