1

所有,我有一些测试代码可以处理一些定义为的测试数据

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在运行时通过

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

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

效果很好,但是由于(我相信)不存在,更新用于处理测试数据的网格视觉效果的代码不再起作用ItemsSource="{Binding TestData}"。应该绑定插入到 aTextBox和单元格中的文本的 XAMLDataGrid是:

<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运行时。

如果数据的结构可以更改,我如何将此数据绑定到DataGrid实现的类?INotifyPropertyChanged

非常感谢你花时间陪伴。

4

1 回答 1

1

我认为布拉姆是对的。(抱歉,我还没有添加评论的权限。)在您的测试代码中,您使用 ObservableCollection,它确实实现了 INotifyPropertyChanged。DataGrid 将获取对该集合的更改。您应该考虑在实际代码中使用 ObservableCollection 并通过它更新数据以由绑定的 DataGrid 拾取,而不是直接通过 dataGrid.ItemsSource。

本页答案中的方法可能会有所帮助:https ://stackoverflow.com/a/1581588/1082026

最后,您的代码可能看起来像这样(注意,您必须定义一个类DataItem来反映 DataSet 的 DataTable 中的一行,特别是您的DataGrid关心的属性):

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

有了这个绑定

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

如果您不想处理 Add() 和 Remove(),这将是您设置集合的方式:

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.
}

希望有帮助!

于 2013-04-17T16:35:58.423 回答