我想将数据模板设计为silverlight静态资源,这有助于我显示项目列表,比如类型IdentityData
。此类IdentityData
有两个数据成员 - Title
(字符串)和Data
(IDictionary(字符串作为键,对象作为值))。
基本上,我想填写IdentityData
的列表,比如以下格式说IdetifiedObjects
-
ID(密钥)1234(值)
形状(键)椭圆(值)
部门(关键)账户(价值)
名称(键)ABC(值)
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>
答案 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>
我做的是:
StackPanels
。在大多数情况下,当您的StackPanel
或任何其他容器控件仅包含单个控件时,这意味着您不需要容器。ItemsControl
。当ItemsControl
自身足以显示多行和多列数据时,DataGrid
包含DataGrid
。您需要选择在此部分中使用ItemsControl
或DataGrid
。请注意,在此之前,我只对您的DataTemplate
构造进行一些更正。但正如您在评论中所说,在尝试调试时没有看到重复结构,那么问题可能存在于您使用DataTemplate
的地方。您应该使用DataTemplate
作为控件的项目模板,该模板可以显示多个项目,例如ListBox
或相同的项目,以便能够看到重复结构。
答案 1 :(得分:0)
你至少看过这些头衔吗?
如果你至少在那里,那么显然存在第二个问题:
DataGridTextColumn
被绑定到集合。 ItemsSource
的{{1}}属性需要绑定到相关集合(您的字典对),而列绑定相对于该集合中的每个项。 / p>
为此,您只需使用单数形式DataGrid
和Key
,它们是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>
某处检查您是否至少看到了正确数量的物品。