WPF模板选择器使用

对于在DataGrid中需要在一列中使用不同方式显示时,比如某一列中有可能会显示文本、图片或者下拉框时,就需要用到模板选择器。话不多说,直接上代码:

界面:

<Window.Resources>
        <DataTemplate x:Key="TextTemp">
            <TextBlock Text="{Binding TextValue}" TextAlignment="Center" />
        </DataTemplate>

        <DataTemplate x:Key="BoolTemp">
            <CheckBox IsChecked="{Binding BoolValue}" />
        </DataTemplate>

        <DataTemplate x:Key="ComBoxTemp">
            <ComboBox ItemsSource="{Binding ComBoxValue}" />
        </DataTemplate>

        <local:IntConverter x:Key="intConverter" />
    </Window.Resources>
    <Grid>
        <DataGrid AutoGenerateColumns="False" CanUserAddRows="False" ItemsSource="{Binding BaseList}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="序号"  Binding="{Binding Num}" />
                <DataGridTextColumn Header="类型" Binding="{Binding Type,Converter={StaticResource intConverter}}"/>
                <DataGridTemplateColumn Header="值">
                    <DataGridTemplateColumn.CellTemplateSelector>
                        <local:TempSelector TextTemplate="{StaticResource TextTemp}" BoolTemplate="{StaticResource BoolTemp}" ComBoxTemplate="{StaticResource ComBoxTemp}"/>
                    </DataGridTemplateColumn.CellTemplateSelector>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>

界面后台:

private MainViewModel viewModel = new MainViewModel();
        public MainWindow()
        {
            this.DataContext = viewModel;
            InitializeComponent();
        }

模板选择器:

public class TempSelector : DataTemplateSelector
    {
        private DataTemplate _TextTemplate = null;
        public DataTemplate TextTemplate
        {
            get
            {
                return _TextTemplate;
            }
            set
            {
                _TextTemplate = value;
            }
        }

        private DataTemplate _BoolTemplate = null;
        public DataTemplate BoolTemplate
        {
            get
            {
                return _BoolTemplate;
            }
            set
            {
                _BoolTemplate = value;
            }
        }

        private DataTemplate _ComBoxTemplate = null;
        public DataTemplate ComBoxTemplate
        {
            get
            {
                return _ComBoxTemplate;
            }
            set
            {
                _ComBoxTemplate = value;
            }
        }

        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            // 选择条件逻辑 
            MyModel baseModel = item as MyModel;
            if (baseModel == null)
            {
                return null;
            }

            switch (baseModel.Type)
            {
                case 0:
                    {
                        return TextTemplate;
                    }
                case 1:
                    {
                        return BoolTemplate;
                    }
                case 2:
                    {
                        return ComBoxTemplate;
                    }
                default:
                    return null;
            }
        }
    }
ViewModel代码:
public class MainViewModel
    {
        public MainViewModel()
        {
            BaseList = new ObservableCollection<MyModel>();

            MyModel baseModel1 = new MyModel();
            baseModel1.Num = 0;
            baseModel1.Type = 0;
            baseModel1.TextValue = "Hello World";

            MyModel baseModel2 = new MyModel();
            baseModel2.Num = 1;
            baseModel2.Type = 1;
            baseModel2.BoolValue = true;

            MyModel baseModel3 = new MyModel();
            baseModel3.Num = 2;
            baseModel3.Type = 2;
            baseModel3.ComBoxValue.Add("苹果");
            baseModel3.ComBoxValue.Add("香蕉");
            baseModel3.ComBoxValue.Add("梨子");

            BaseList.Add(baseModel1);
            BaseList.Add(baseModel2);
            BaseList.Add(baseModel3);
        }

        public ObservableCollection<MyModel> BaseList { get; set; }
    }

Model代码:

 public class MyModel
    {
        public MyModel()
        {
            ComBoxValue = new ObservableCollection<string>();
        }

        // 编号
        public int Num { get; set; }

        // 类型
        public int Type { get; set; }

        // Text值
        public string TextValue { get; set; }

        // Bool值
        public bool BoolValue { get; set; }

        // ComBox值
        public ObservableCollection<string> ComBoxValue { get; set; }
    }

资源地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值