我正在Silverlight 4中构建自定义用户控件。控件背后的想法是将带有分页器的数据网格从用户页面移动到控件。目前数据网格如下:
<sdk:DataGrid x:Name="GridCustomers" Height="300" VerticalAlignment="Top" ItemsSource="{Binding CustomerModelsPagedCollectionView}" AutoGenerateColumns="False" ScrollViewer.VerticalScrollBarVisibility="Visible" IsReadOnly="True" SelectionChanged="GridCustomers_SelectionChanged">
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn Header="Numer bilingowy" Binding="{Binding BillingNumber}" />
<sdk:DataGridTextColumn Header="Nazwa klienta" Binding="{Binding CustomerName}"/>
<sdk:DataGridTextColumn Header="Skrócona nazwa" Binding="{Binding ShortCustomerName}"/>
<sdk:DataGridTextColumn Header="Kod pocztowy" Binding="{Binding PostalCode}" />
<sdk:DataGridTextColumn Header="Miasto" Binding="{Binding City}" />
<sdk:DataGridTextColumn Header="Ulica" Binding="{Binding Street}" />
<sdk:DataGridTemplateColumn Header="Urządzenia">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox x:Name="DeviceComboBox" SelectionChanged="DeviceComboBox_SelectionChanged">
<ComboBox.Items>
<ComboBoxItem x:Name="Switch" Content="Switche"/>
<ComboBoxItem x:Name="Firewall" Content="Firewalle"/>
<ComboBoxItem x:Name="Host" Content="Hosty" />
</ComboBox.Items>
</ComboBox>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
除了从几页中删除此网格的重复代码之外,我最想实现的是为用户提供此控件的灵活性来定义该模板列。换句话说,我正在尝试公开DataGrid列属性,因此可以添加不同的DataGridTemplateColumns。由于我对SL的经验很少,我做了一些研究,根据我发现的“附加属性”是我需要的(需要确认)。我使用this tutorial.这样定义了DependencyProperty(控制代码 - CustomerControl):
public static readonly DependencyProperty ColumnTemplateProperty = DependencyProperty.RegisterAttached(
"ColumnTemplate",
typeof(DataGridTemplateColumn),
typeof(CustomerControl),
null);
public static void SetColumnTemplate(DependencyObject obj, DataGridTemplateColumn column)
{
obj.SetValue(ColumnTemplateProperty, column);
}
public static DataGridTemplateColumn GetColumnTemplate(DependencyObject obj)
{
return (DataGridTemplateColumn)obj.GetValue(ColumnTemplateProperty);
}
Control的XAML:
<local:CustomerControl x:Name="temp" >
<local:CustomerControl.ColumnTemplate>
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox x:Name="DeviceComboBox" SelectionChanged="DeviceComboBox_SelectionChanged">
<ComboBox.Items>
<ComboBoxItem x:Name="Switch" Content="Switche"/>
<ComboBoxItem x:Name="Firewall" Content="Firewalle"/>
<ComboBoxItem x:Name="Host" Content="Hosty" />
</ComboBox.Items>
</ComboBox>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</local:CustomerControl.ColumnTemplate>
</local:CustomerControl>
由于我暴露了'DataGridTemplateColumn'类型的属性我打了剩下的模板声明不会改变,但这不起作用:(我不确定这个附加属性。你能给我一些提示如何获得这是按照我提出的方式工作(或者我应该说'想象'我希望它如何工作)。它甚至可能吗?我知道这里存在一些重大缺陷,但只是为了记录,我得到的错误:
错误3在'DataGridTemplateColumn'类型中找不到可附加属性'CellTemplate' 错误2解析规则PropertyElement :: =中的意外PROPERTYELEMENT。 PROPERTYELEMENT内容? ENDTAG
感谢您使用任何类型的指针;)