将Dictionary <string,datatable =“”>绑定到ItemsControl不起作用

时间:2016-11-02 21:56:19

标签: c# wpf dictionary binding itemscontrol

当扩展列表中的字典项时,我需要在字典中显示每个数据表(值)。字典项的键应该是扩展器头。视图模型正确填充数据,但UI上不显示任何内容。如何获取要在UI上显示的数据表列表 到目前为止,这就是我所拥有的:

<!-- Data grid template -->
<DataTemplate x:Key="ValuesTemplate">
  <Grid>
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto"/>
      <RowDefinition />
    </Grid.RowDefinitions>

    <TextBlock Text="data grid header text" Margin="20,0,0,0" Grid.Row="2"/>
    <DataGrid ItemsSource="{Binding Value[0]}"/>
  </Grid>
</DataTemplate>

<!-- List of data tables -->
<ItemsControl ItemsSource="{Binding myDictionary}" VirtualizingStackPanel.IsVirtualizing="True">
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <Expander IsExpanded="True" Margin="0,0,0,10">
        <Expander.Header>
          <TextBlock Text="{Binding Key}" Margin="0,0,20,0" VerticalAlignment="Top"/>
        </Expander.Header>
        <ContentControl Content="{Binding}" ContentTemplate="{StaticResource ValuesTemplate}" ScrollViewer.CanContentScroll="True" Margin="20,0,0,0"/>
      </Expander>
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

1 个答案:

答案 0 :(得分:0)

在WPF中,ItemsControl.ItemsSource可以绑定到任何实现IEnumerable的类型。那么,Dictionary<TKey, TValue>如何用IEnumerable表示?它是IEnumerable<KeyValuePair<TKey, TValue>>

因此,您可以忽略这样一个事实:您有一个字典,而是将其视为KeyValuePair<TKey, TValue>个对象的枚举。

现在,您实现的主要部分主要是正确。您有ItemsControl,已正确绑定,并且您正在为每个项目应用DataTemplate。但是,请记住每个项目都是KeyValuePair。因此,TextBlock.Text属性正确绑定到属性,但内容绑定到项目(KeyValuePair<TKey, TValue)本身。这可能是故意的,但我的猜测是你可能希望将ContentControl绑定到 Value 属性。

第二部分是您要对原始ContentTemplate中的每个Content应用DataTemplate。我看到至少有一个,也许是两个潜在的错误:

  1. ValuesTemplate似乎在假设内容属于DataTable类型的情况下工作,而实际上它是KeyValuePair<string, DataTable>的类型。在这种情况下,我会将Content绑定到属性。
  2. ValuesTempalte似乎也将DataGrid.ItemsSource绑定到Values[0]。我的假设是,再次,您认为您的内容是DataTable的类型,如果不是,即使是这种情况,为什么要将ItemsSource绑定到DataTable中的第一行{1}}?你的DataTable是否由行组成,每行都是序列本身?我猜你只想做<DataGrid ItemsSource="{Binding}" />
  3. TL; DR;

    <!-- Data grid template -->
    <DataTemplate x:Key="ValuesTemplate">
      <Grid>
        <Grid.RowDefinitions>
          <RowDefinition Height="Auto" />
          <RowDefinition />
        </Grid.RowDefinitions>
    
        <TextBlock Text="data grid header text" Margin="20,0,0,0" Grid.Row="2" />
        <DataGrid ItemsSource="{Binding}" />
      </Grid>
    </DataTemplate>
    
    <!-- List of data tables -->
    <ItemsControl ItemsSource="{Binding MyDictionary}" VirtualizingStackPanel.IsVirtualizing="True">
      <ItemsControl.ItemTemplate>
        <DataTemplate>
          <Expander IsExpanded="True" Margin="0,0,0,10">
            <Expander.Header>
              <TextBlock Text="{Binding Key}" Margin="0,0,20,0" VerticalAlignment="Top" />
            </Expander.Header>
            <ContentControl Content="{Binding Value}" ContentTemplate="{StaticResource ValuesTemplate}" ScrollViewer.CanContentScroll="True" Margin="20,0,0,0" />
          </Expander>
        </DataTemplate>
      </ItemsControl.ItemTemplate>
    </ItemsControl>