特定控制特定的数据类型(Specific control for a specific DataTy

2019-08-22 10:21发布

我有一个包含不同类型的对象的列表:

    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用于DateTimeTextBlockstringTextBoxPerson的名字和姓氏...

是否有可能做这个任务XAML

帮助表示赞赏。

Answer 1:

<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为每种类型。



文章来源: Specific control for a specific DataType
标签: wpf xaml listbox