我有一个包含不同类型的对象的列表:
List<object> myList = new List<object>();
DateTime date = DateTime.Now;
myList.Add(date);
int digit = 50;
myList.Add(digit);
myList.Add("Hello World");
var person = new Person() { Name = "Name", LastName = "Last Name", Age = 18 };
list.ItemsSource = myList;
public class Person
{
public string Name { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
我希望看到他们在一个ListBox
与不同类型的控件。 例如: DatePicker
用于DateTime
, TextBlock
的string
, TextBox
的Person
的名字和姓氏...
是否有可能做这个任务XAML
?
帮助表示赞赏。
<Window x:Class="MiscSamples.DataTemplates"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="DataTemplates"
Height="300"
Width="300">
<Window.Resources>
<!-- DataTemplate for strings -->
<DataTemplate DataType="{x:Type sys:String}">
<TextBox Text="{Binding Path=.}" />
</DataTemplate>
<!-- DataTemplate for DateTimes -->
<DataTemplate DataType="{x:Type sys:DateTime}">
<DataTemplate.Resources>
<DataTemplate DataType="{x:Type sys:String}">
<TextBlock Text="{Binding Path=.}" />
</DataTemplate>
</DataTemplate.Resources>
<DatePicker SelectedDate="{Binding Path=.}" />
</DataTemplate>
<!-- DataTemplate for Int32 -->
<DataTemplate DataType="{x:Type sys:Int32}">
<Slider Maximum="100"
Minimum="0"
Value="{Binding Path=.}"
Width="100" />
</DataTemplate>
</Window.Resources>
<ListBox ItemsSource="{Binding}" />
</Window>
代码背后:
public partial class DataTemplates : Window
{
public DataTemplates()
{
InitializeComponent();
var myList = new List<object>();
myList.Add(DateTime.Now);
myList.Add(50);
myList.Add("Hello World");
DataContext = myList;
}
}
结果:
正如你所看到的,我们没有理由在所有使用代码来操纵WPF UI元素(除了一些非常非常特殊的情况)
编辑:
请注意,您通常不会创建一个DataTemplate
的内部类的System
命名空间(如System.String
,这是只给你举个例子,如果你真的需要这一点,你可能必须要创建一个ViewModel
为每种类型。