C# 两种不同的数据模板
我在XAML中定义了两个列表框,在MyListItem中定义了一个类。 现在,一个列表框应将名称显示为按钮,第二个列表框应将名称显示为文本块 这里有一个小例子,两个listbox的行为相同 MyListItemC# 两种不同的数据模板,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;} } }
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);
}
}
}