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>

  

  

posted @ 2023-06-27 18:55  出门必戴双肩包  阅读(417)  评论(0编辑  收藏  举报