【问题标题】:Selecting a DataTemplate based on DataContext property in Avalonia在 Avalonia 中根据 DataContext 属性选择 DataTemplate
【发布时间】:2020-11-22 04:46:44
【问题描述】:

我正在实现一个应该显示设置列表的 UserControl:

public class SettingPropertyItem {
    string Name { get; }
    Type ValueType { get; }
    object Value { get; set; }
}

应根据ValueType 中的每种类型使用不同的DataTemplate。
为方便起见,UserControl 具有以下 Control,其 DataContext 为 SettingPropertyItem

<UserControl x:Class="AVDump3Gui.Controls.Settings.SettingsView">
    ...
    <ItemsControl Items="{Binding Properties}" Margin="16,0,0,0">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
            ...
                <ContentControl Content="{Binding}"/>
            ...
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    ...
</UserControl>

然后在使用 Usercontrol 的视图中,我在其 DataTemplates 中添加了一个 DataTemplate:

<sv:SettingsView.DataTemplates>
  <DataTemplate DataType="{x:Type vm:SettingPropertyItem}">
    ...
  </DataTemplate>
</sv:SettingsView.DataTemplates>

到目前为止一切顺利,一切正常。但现在我有点难过,因为我不知道如何根据 DataContext 中的属性应用不同的 DataTemplate。
使用 WPF,DataTemplateSelector 或 Triggers 似乎是要走的路(忽略其他框架),但它们似乎在 Avalonia 中不存在。我也尝试过样式,但选择器似乎无法访问 DataContext 属性。

如何做到这一点?

【问题讨论】:

    标签: c# datatemplate datatemplateselector avaloniaui


    【解决方案1】:

    在 Avalonia 中不需要 DataTemplateSelector,因为您可以自己实现 IDataTemplate 并在那里选择模板。

    我。 e.

    public class MyTemplateSelector : IDataTemplate
    {
        public bool SupportsRecycling => false;
        [Content]
        public Dictionary<string, IDataTemplate> Templates {get;} = new Dictionary<string, IDataTemplate>();
    
        public IControl Build(object data)
        {
            return Templates[((MyModel) data).Value].Build(data);
        }
    
        public bool Match(object data)
        {
            return data is MyModel;
        }
    }
    
    public class MyModel
    {
        public string Value { get; set; }
    }
    
      <ItemsControl>
        <ItemsControl.Items>
          <scg:List x:TypeArguments="local:MyModel">
            <local:MyModel Value="MyKey"/>
            <local:MyModel Value="MyKey2"/>
          </scg:List>
        </ItemsControl.Items>
        <ItemsControl.DataTemplates>
          <local:MyTemplateSelector>
            <DataTemplate x:Key="MyKey">
              <TextBlock Background="Red" Text="{Binding Value}"/>
            </DataTemplate>
            <DataTemplate x:Key="MyKey2">
              <TextBlock Background="Blue" Text="{Binding Value}"/>
            </DataTemplate>
            
          </local:MyTemplateSelector>
        </ItemsControl.DataTemplates>
      </ItemsControl>
    

    【讨论】:

    • 谢谢,这正是我想要的。
    猜你喜欢
    • 2021-07-03
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 2012-10-10
    相关资源
    最近更新 更多