Silverlight 5中的DataTemplate显示列表数据

时间:2014-01-08 05:16:41

标签: c# datatemplate silverlight-5.0

我想将数据模板设计为silverlight静态资源,这有助于我显示项目列表,比如类型IdentityData。此类IdentityData有两个数据成员 - Title(字符串)和Data(IDictionary(字符串作为键,对象作为值))。 基本上,我想填写IdentityData的列表,比如以下格式说IdetifiedObjects -

标题1

ID(密钥)1234(值)

形状(键)椭圆(值)

部门(关键)账户(价值)

名称(键)ABC(值)

标题2

ID(密钥)5678(值)

形状(键)圆(值)

部门(关键)服务台(价值)

名称(键)XYZ(值)

有人可以帮助我获取数据模板以这种格式显示数据吗?

提前致谢。


以下是我正在使用的DataTemplate -

<DataTemplate x:Key="InfoWindowDataTemplate">
   <StackPanel Orientation="Vertical">
     <Grid x:Name="TitleGrid">
       <Grid.RowDefinitions>
         <RowDefinition></RowDefinition>
         <RowDefinition></RowDefinition>
         <RowDefinition></RowDefinition>
       </Grid.RowDefinitions>
     <TextBlock x:Name="TxtTitle" Text="{Binding Path = Title}" Width="Auto" Height="Auto" FontWeight="Bold" Grid.Row="0"/>
     <TextBlock x:Name="TxtLineDivider" Text ="-----------------------------" Width="Auto" Height="Auto" Grid.Row="1"/>
     <ItemsControl ItemsSource="{Binding Path = Data}" >
        <ItemsControl.ItemTemplate>
           <DataTemplate>
              <StackPanel Orientation="Vertical" Grid.Row="2">
                 <sdk:DataGrid ItemsSource="{Binding Path = Data}">
                 <sdk:DataGrid.Columns>
                   <sdk:DataGridTextColumn Binding="{Binding Keys}"></sdk:DataGridTextColumn>
                   <sdk:DataGridTextColumn Binding="{Binding Values}"></sdk:DataGridTextColumn>
                 </sdk:DataGrid.Columns>
                 </sdk:DataGrid>
              </StackPanel>
           </DataTemplate>
        </ItemsControl.ItemTemplate>
     </ItemsControl>
    </Grid>
   </StackPanel>
</DataTemplate>

想要在datatemplate中显示的类列表如下所示

public class IdentityData : INotifyPropertyChanged
{
    private string title;
    private IDictionary<string, object> data;

    public string Title
    {
        get
        {
            return this.title;
        }

        set
        {
            this.title = value;
            this.NotifyPropertyChanged(this,"Title");
        }
    }

    public IDictionary<string, object> Data
    {
        get
        {
            return this.data;
        }

        set
        {
            this.data = value;
            this.NotifyPropertyChanged(this,"Data");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public virtual void NotifyPropertyChanged(object sender, string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(sender, new PropertyChangedEventArgs(propertyName));
    }

}

更新:

以下是我使用DataTemplate的方法。我用它来控制那种InfoWindow(第三方小窗口控件,弹出显示信息):

<e:InfoWindow x:Name="IdentityInfoWindow" Padding="2" CornerRadius="10" 
              Map="{Binding ElementName=Map}" ContentTemplate="{StaticResource InfoWindowDataTemplate}" 
              Content="{Binding Path= IdetifiedObjects, Mode=TwoWay}" Anchor ="{Binding Path= Anchor}" 
              IsOpen="{Binding = IsIdentityWindowOpen}">
    <e:InfoWindow.Background> 
        <LinearGradientBrush EndPoint="1.038,1.136" StartPoint="0.015,0.188">
        <GradientStop Color="#FFD1DFF2"/> 
        <GradientStop Color="#FF666666" Offset="0.946"/> 
        </LinearGradientBrush> 
    </e:InfoWindow.Background>
</e:InfoWindow>

2 个答案:

答案 0 :(得分:0)

你可以试试这个:

<DataTemplate x:Key="InfoWindowDataTemplate">
   <Grid x:Name="TitleGrid">
       <Grid.RowDefinitions>
         <RowDefinition Height="Auto"/>
         <RowDefinition Height="Auto"/>
         <RowDefinition Height="*"/>
       </Grid.RowDefinitions>
         <TextBlock x:Name="TxtTitle" Text="{Binding Path = Title}" Width="Auto" Height="Auto" FontWeight="Bold" Grid.Row="0"/>
         <TextBlock x:Name="TxtLineDivider" Text ="-----------------------------" Width="Auto" Height="Auto" Grid.Row="1"/>
         <sdk:DataGrid Grid.Row="2" ItemsSource="{Binding Path = Data}">
             <sdk:DataGrid.Columns>
               <sdk:DataGridTextColumn Binding="{Binding Keys}"></sdk:DataGridTextColumn>
               <sdk:DataGridTextColumn Binding="{Binding Values}"></sdk:DataGridTextColumn>
             </sdk:DataGrid.Columns>
         </sdk:DataGrid>
        </Grid>
</DataTemplate>

我做的是:

  • 删除了2 StackPanels。在大多数情况下,当您的StackPanel或任何其他容器控件仅包含单个控件时,这意味着您不需要容器。
  • 已移除ItemsControl。当ItemsControl自身足以显示多行和多列数据时,DataGrid包含DataGrid。您需要选择在此部分中使用ItemsControlDataGrid

请注意,在此之前,我只对您的DataTemplate构造进行一些更正。但正如您在评论中所说,在尝试调试时没有看到重复结构,那么问题可能存在于您使用DataTemplate的地方。您应该使用DataTemplate作为控件的项目模板,该模板可以显示多个项目,例如ListBox或相同的项目,以便能够看到重复结构

答案 1 :(得分:0)

你至少看过这些头衔吗?

如果你至少在那里,那么显然存在第二个问题:

DataGridTextColumn被绑定到集合。 ItemsSource的{​​{1}}属性需要绑定到相关集合(您的字典对),而列绑定相对于该集合中的每个项。 / p>

为此,您只需使用单数形式DataGridKey,它们是Value的属性。

KeyValuePair<K, V>

还有一点需要注意的是,UI初始化后对字典的任何更改都不会反映出来,因为<sdk:DataGrid Grid.Row="2" ItemsSource="{Binding Data}"> <sdk:DataGrid.Columns> <sdk:DataGridTextColumn Binding="{Binding Key}"></sdk:DataGridTextColumn> <sdk:DataGridTextColumn Binding="{Binding Value}"></sdk:DataGridTextColumn> </sdk:DataGrid.Columns> </sdk:DataGrid> s是不可观察的。

如果您甚至没有看到标题,请添加

Dictionary<K, V>

某处检查您是否至少看到了正确数量的物品。