对于在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; }
}