【发布时间】:2019-11-01 22:01:31
【问题描述】:
所以我尝试使用 DataTemplateSelector 制作自定义样式的 DataGrid。我是 WPF 和绑定的新手,所以我可能做错了什么。
作为 SelectTemplate 函数的参数接收的项目对象始终为空。
我试过用谷歌搜索这个问题,但找不到答案。
XAML:
<Grid.Resources>
<!-- Default DataTemplate -->
<DataTemplate x:Key="DefaultDataTemplate">
<TextBlock Text="{Binding Path=Value}" />
</DataTemplate>
<!-- DataTemplate for Booleans -->
<DataTemplate x:Key="BooleanDataTemplate">
<CheckBox IsChecked="{Binding Path=Value, Mode=TwoWay}" />
</DataTemplate>
<!-- DataTemplate for Arrays -->
<DataTemplate x:Key="ArrayDataTemplate">
<ComboBox ItemsSource="{Binding Path=Value, Mode=TwoWay}" />
</DataTemplate>
<local:ValueDataTemplateSelector x:Key="templateSelector"
DefaultDataTemplate="{StaticResource DefaultDataTemplate}"
BooleanDataTemplate="{StaticResource BooleanDataTemplate}"
ArrayDataTemplate="{StaticResource ArrayDataTemplate}" />
</Grid.Resources>
<DataGrid Name="DG1" ItemsSource="{Binding TagListView}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTextColumn Header="Name" />
<DataGridTemplateColumn Header="Value" CellTemplateSelector="{StaticResource templateSelector}" CellEditingTemplateSelector="{StaticResource templateSelector}" />
</DataGrid.Columns>
</DataGrid>
后面的代码:
public partial class TestView : Window
{
public TestView()
{
var t = new TestViewModel();
DataContext = t;
InitializeComponent();
}
}
视图模型:
class TestViewModel
{
public TestViewModel()
{
generateTestList();
TagListView = new ListCollectionView(testList);
}
private ObservableCollection<TestTag> testList;
private void generateTestList()
{
testList = new ObservableCollection<TestTag>();
bool b = false;
testList.Add(new TestTag("bool", (object)b, b.GetType()));
string s = "...";
testList.Add(new TestTag("string", (object)s, s.GetType()));
ushort ui = (ushort)100u;
testList.Add(new TestTag("uint16", (object)ui, ui.GetType()));
int[] i_arr = new int[] { 1, 2, 3 };
testList.Add(new TestTag("int[]", (object)i_arr, i_arr.GetType()));
}
public ListCollectionView TagListView { get; private set; }
}
数据模板选择器。 SelectTemplate 的“item”参数始终为空
public class ValueDataTemplateSelector : DataTemplateSelector
{
public DataTemplate DefaultDataTemplate { get; set; }
public DataTemplate BooleanDataTemplate { get; set; }
public DataTemplate ArrayDataTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var tag = item as TestTag;
Type t = tag.Type;
if (t == typeof(bool))
return BooleanDataTemplate;
if (t == typeof(int[]))
return ArrayDataTemplate;
return DefaultDataTemplate;
}
}
模型
class TestTag : INotifyPropertyChanged
{
private string _Name;
private object _Value;
public Type Type;
public string Name
{
get { return _Name; }
private set
{
_Name = value;
NotifyPropertyChanged("Name");
}
}
public object Value
{
get
{
return _Value;
}
set
{
_Value = value;
NotifyPropertyChanged("Value");
}
}
【问题讨论】: