avalonia的IDataTemplate使用
1、IDataTemplate的作用
如果你需要对DataTemplate有更多的控制,你可以通过创建一个实现idatatemplate接口的类来实现。使用这个接口,您可以创建自己的DataTemplate,不仅可以定义数据的DataType,还可以定义它的属性。它相当于wpf里的trigger。
2、怎么实现?
要使用这个接口,你必须在类中实现以下两个成员:
public bool Match(object data) { ... }你需要在这个方法中检查所提供的数据是否与你的IDataTemplate匹配。如果数据匹配,则需要返回true,否则返回false。
public IControl Build(object param) { ... }在此方法中,您需要构建并返回代表数据的控件。
3、实例:
(1)继承IDataTemplate接口
public class MytSelector : IDataTemplate { /// <summary> /// 定义正常状态 /// </summary> public IDataTemplate NormalState { get; set; } /// <summary> /// 定义错误状态 /// </summary> public IDataTemplate ErrorState { get; set; } public IControl Build(object param) { //ModelData是实体类 if (param is ModelData item) { //IsErrorMethod是ModelData类的属性 if (item.IsErrorMethod) { return ErrorState.Build(param); } else { return NormalState.Build(param); } } return new Control(); } public bool Match(object data) { return data is ModelData; } }
(2)在目标axaml引用MySelector类的命名空间
xmlns:dataTemplates="using:MyApp.DataTemplates"
(3)在控件里调用
<DataGrid CanUserReorderColumns="False" Items="{Binding ModelObjestList}"> <DataGrid.Columns> <DataGridTemplateColumn Header="号码" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <dataTemplates:MytSelector> <dataTemplates:MytSelector.NormalState> <DataTemplate> <TextBlock VerticalAlignment="Center" Text="{Binding Id}" /> </DataTemplate> </dataTemplates:MytSelector.NormalState> <dataTemplates:MytSelector.ErrorState> <DataTemplate> <TextBlock VerticalAlignment="Center" Background="Red" Text="{Binding Id}" /> </DataTemplate> </dataTemplates:MytSelector.ErrorState> </dataTemplates:MytSelector> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
如果xaml的模板选择器外绑定的属性不是预期的属性,则需要定义ContentControl绑定
<ContentControl Content="{Binding BoolMethod}" x:Name="ContentControlName"> <ContentControl.ContentTemplate> <dataTemplates:MytSelector> <dataTemplates:MytSelector.NormalState> <DataTemplate> <DataGrid CanUserReorderColumns="False" Items="{Binding ModelObjestList}" DataContext="{Binding #ContentControlName.DataContext}"> <DataGrid.Columns> <DataGridTemplateColumn Header="号码" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <dataTemplates:MytSelector> <dataTemplates:MytSelector.NormalState> <DataTemplate> <TextBlock VerticalAlignment="Center" Text="{Binding Id}" /> </DataTemplate> </dataTemplates:MytSelector.NormalState> <dataTemplates:MytSelector.ErrorState> <DataTemplate> <TextBlock VerticalAlignment="Center" Text="{Binding Id}" /> </DataTemplate> </dataTemplates:MytSelector.ErrorState> </dataTemplates:MytSelector> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> </DataTemplate> </dataTemplates:MytSelector.NormalState> <dataTemplates:MytSelector.ErrorState> <DataTemplate> <DataGrid CanUserReorderColumns="False" Items="{Binding ModelObjestList}" DataContext="{Binding #ContentControlName.DataContext}"> <DataGrid.Columns> <DataGridTemplateColumn Header="号码" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <dataTemplates:MytSelector> <dataTemplates:MytSelector.NormalState> <DataTemplate> <TextBlock VerticalAlignment="Center" Text="{Binding Id}" /> </DataTemplate> </dataTemplates:MytSelector.NormalState> <dataTemplates:MytSelector.ErrorState> <DataTemplate> <TextBlock VerticalAlignment="Center" Background="Red" Text="{Binding Id}" /> </DataTemplate> </dataTemplates:MytSelector.ErrorState> </dataTemplates:MytSelector> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> </DataTemplate> </dataTemplates:MytSelector.ErrorState> </dataTemplates:MytSelector> </ContentControl.ContentTemplate> </ContentControl>