Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 两种不同的数据模板_C#_Xaml_Avaloniaui - Fatal编程技术网

C# 两种不同的数据模板

C# 两种不同的数据模板,c#,xaml,avaloniaui,C#,Xaml,Avaloniaui,我在XAML中定义了两个列表框,在MyListItem中定义了一个类。 现在,一个列表框应将名称显示为按钮,第二个列表框应将名称显示为文本块 这里有一个小例子,两个listbox的行为相同 MyListItem public class MyListItem { private string _name; public string Name { get{return _name;} set{_name = value;} } }

我在XAML中定义了两个列表框,在MyListItem中定义了一个类。 现在,一个列表框应将名称显示为按钮,第二个列表框应将名称显示为文本块

这里有一个小例子,两个listbox的行为相同

MyListItem

public class MyListItem
{
    private string _name;
    public string Name
    {
        get{return _name;}
        set{_name = value;}
    }
}
XAML


视图模式

public class MainWindowViewModel
{
            public ObservableCollection<MyListItem> List1 { get; set; }
    public ObservableCollection<MyListItem> List2 { get; set; }
    public ObservableCollection<MyListItem> List3 { get; set; }

    public MainWindowViewModel()
    {
        List1 = new ObservableCollection<MyListItem>();
        List2 = new ObservableCollection<MyListItem>();
        List3 = new ObservableCollection<MyListItem>();

        Random rand = new Random();

        for (int i = 0; i < rand.Next(1, 20); i++)
        {
            MyListItem mli = new MyListItem();
            mli.Name = "ListItem" + i;
            List1.Add(mli);
        }

        for (int i = 0; i < rand.Next(1, 20); i++)
        {
            MyListItem mli = new MyListItem();
            mli.Name = "ListItem" + i;
            List2.Add(mli);
        }

        for (int i = 0; i < rand.Next(1, 20); i++)
        {
            MyListItem mli = new MyListItem();
            mli.Name = "ListItem" + i;
            List3.Add(mli);
        }
    }
}
公共类MainWindowViewModel
{
公共ObservableCollection列表1{get;set;}
公共ObservableCollection列表2{get;set;}
公共ObservableCollection列表3{get;set;}
公共主窗口视图模型()
{
List1=新的ObservableCollection();
List2=新的ObservableCollection();
List3=新的ObservableCollection();
Random rand=新的Random();
for(int i=0;i
您需要使用ItemsControl而不是ListBox,并为每个控件设置不同的ItemTemplate


一个指向带有TextBlock的DataTemplate(使用x:Key,而不是DataType),另一个指向带有Button的DataTemplate。

不幸的是,目前在Avalonia中,我想不出有什么好方法可以做到这一点。最明显的方法是将数据模板添加到
集合中,并使用
{StyleResource}
引用它们,但这在当前不起作用

我认为目前有两种选择:

  • 只需将数据模板复制并粘贴到
    ItemsControl.itemstemplate
  • 在代码中定义数据模板,并使用
    {Static}
    引用它们。为此,您可以使用

  • 我在此处添加了一个问题来跟踪此问题:

    我更新了代码。如何引用Window.DataTemplates?对于ItemTemplate属性中的StaticResource,我遇到了一个异常。我刚刚注意到您编写的“Window.DataTemplates”部分。它应该是“Window.Resources”,我在Linux上使用dotnetcore和AvaloniaUI,而不是WPF。没有窗口。对不起,伙计,没有注意到这一点,忽略我的回答。我更新了我的代码,就像你在第1点中所说的。它正在发挥作用。我只是喜欢你写的项目模板。DataTemplate和ItemTemplate之间的区别是什么?区别大致与WPF中的相同:
    ItemTemplate
    表示“对每个项目不间断地使用此模板”而将模板放入
    DataTemplates
    类似于将模板添加到WPF中的资源中,将根据项目的类型选择模板。
    public class MainWindowViewModel
    {
                public ObservableCollection<MyListItem> List1 { get; set; }
        public ObservableCollection<MyListItem> List2 { get; set; }
        public ObservableCollection<MyListItem> List3 { get; set; }
    
        public MainWindowViewModel()
        {
            List1 = new ObservableCollection<MyListItem>();
            List2 = new ObservableCollection<MyListItem>();
            List3 = new ObservableCollection<MyListItem>();
    
            Random rand = new Random();
    
            for (int i = 0; i < rand.Next(1, 20); i++)
            {
                MyListItem mli = new MyListItem();
                mli.Name = "ListItem" + i;
                List1.Add(mli);
            }
    
            for (int i = 0; i < rand.Next(1, 20); i++)
            {
                MyListItem mli = new MyListItem();
                mli.Name = "ListItem" + i;
                List2.Add(mli);
            }
    
            for (int i = 0; i < rand.Next(1, 20); i++)
            {
                MyListItem mli = new MyListItem();
                mli.Name = "ListItem" + i;
                List3.Add(mli);
            }
        }
    }