我想完成以下 ListView ,它在同一列中使用不同的控件。
它有两列:名称和设置。名称列中第一行的条目是“开/关”,设置是一个复选框。第二行的名称是“Elevation”,它的设置是一个文本框。
我希望能够以编程方式填充 ListView 。
谢谢!
最佳答案
模板选择器允许您在运行时在不同的数据模板之间进行选择,以在 ListView 等项目控件中使用。
XAML:
<Window x:Class="ListViewTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ListViewTest"
Height="300" Width="300">
<Window.Resources>
<DataTemplate x:Key="textBoxTemplate">
<TextBox Text="{Binding Path=Value}" Width="100"></TextBox>
</DataTemplate>
<DataTemplate x:Key="checkBoxTemplate">
<CheckBox IsChecked="{Binding Path=Value}" IsThreeState="False"></CheckBox>
</DataTemplate>
<local:SettingsTemplateSelector
x:Key="settingsTemplateSelector"
TextBoxTemplate="{StaticResource textBoxTemplate}"
CheckBoxTemplate="{StaticResource checkBoxTemplate}" />
</Window.Resources>
<ListView ItemsSource="{Binding Path=Settings}">
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn
Header="Name"
DisplayMemberBinding="{Binding Path=Name}" />
<GridViewColumn
Header="Setting"
CellTemplateSelector="{StaticResource settingsTemplateSelector}" />
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
</Window>
代码隐藏:
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
namespace ListViewTest
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
Settings = new List<Setting>();
Settings.Add(new Setting("On/Off", true));
Settings.Add(new Setting("Elevation", "100"));
DataContext = this;
}
public List<Setting> Settings { get; private set; }
}
public class Setting
{
public Setting(string name, string value)
{
Name = name;
Value = value;
IsCheckBox = false;
}
public Setting(string name, bool value)
{
Name = name;
Value = value;
IsCheckBox = true;
}
public string Name { get; private set; }
public object Value { get; set; }
public bool IsCheckBox { get; private set; }
}
public class SettingsTemplateSelector : DataTemplateSelector
{
public DataTemplate CheckBoxTemplate { get; set;}
public DataTemplate TextBoxTemplate { get; set;}
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
Setting setting = item as Setting;
if (setting.IsCheckBox)
{
return CheckBoxTemplate;
}
return TextBoxTemplate;
}
}
}
关于WPF:在同一列中带有复选框和文本框的 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1830501/