Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF: listview with checkbox and textbox in the same column

I'd like to accomplish the following listview, which uses different controls in the same column.

It has two columns: Name and Setting. The first row's entry in the Name column is "On/Off" and the Setting is a checkbox. The second row's Name is "Elevation" and its setting is a textbox.

I want to be able to populate the listview programmatically.

Thanks!

like image 244
Warpin Avatar asked Jan 29 '26 02:01

Warpin


1 Answers

Template selectors allow you at runtime to select between different data templates to use in items controls like list view.

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>

Code behind:

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;
        }
    }
}
like image 121
Wallstreet Programmer Avatar answered Feb 01 '26 06:02

Wallstreet Programmer



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!