WPF:在同一列中带有复选框和文本框的 ListView

标签 wpf listview checkbox textbox

我想完成以下 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/

相关文章:

wpf - 将 DataGridColumn 的 Width 属性绑定(bind)到父 DataGrid 的 ActualWidth

wpf - 如何使用自定义方法向组合框添加第二个按钮?

.net - WPF 中的 MVVM - UserControls 和 GMap.NET

android - 如何跳过listview的getView中的特定行

Android 列表选择器在自定义 ListView 中不可见

android - ListView 的自定义适配器

wpf - 如何证明包装面板中的项目?

javascript - 根据 .jqGrid 中第一个复选框的选择读取第二个复选框的值

javascript - HTML 复选框到 Javascript 表单

javascript 复选框换行