我有一个DataGrid,它使用DataGridTemplateColumn来显示集合的项目。我使用了模板列,因为有些项表示布尔值,有些表示字符串等,我想要不同的控件供用户编辑。
我可以根据集合中的数据类型将模板列设置为 show 正确的控件但我无法使其实际更新基础值我编辑它们。
同时,如果我创建一个相应的DataGridTextColumn来显示相同的值,那么每次将更新基础字符串值。我无法弄清楚我做错了什么。
我通过在" set"上设置断点来测试这一点。我将每列链接到的属性的方法。 TextColumn调用set方法,但Template列不调用。
我在这里缺少什么?
Here's what the output looks like:
XAML:
<DataGrid ItemsSource="{Binding Path=Data}"
AutoGenerateColumns="False"
SelectionMode="Single"
VerticalScrollBarVisibility="Auto"
CanUserAddRows="False"
CanUserDeleteRows="False"
>
<DataGrid.Resources>
<DataTemplate DataType="{x:Type local:StringData}" x:Key="StringTemplate" >
<TextBox Text="{Binding ValueS, Mode=TwoWay}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:BoolData}" x:Key="BoolTemplate" >
<CheckBox IsChecked="{Binding ValueB, Mode=TwoWay}"/>
</DataTemplate>
<local:TemplateSelector x:Key="ParamSelector"
BoolTemplate="{StaticResource BoolTemplate}"
StringTemplate="{StaticResource StringTemplate}"/>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" IsReadOnly="True"/>
<DataGridTextColumn Binding="{Binding Value}"/>
<DataGridTemplateColumn CellTemplateSelector="{StaticResource ParamSelector}"
CellEditingTemplateSelector="{StaticResource ParamSelector}"
MinWidth="80"/>
</DataGrid.Columns>
</DataGrid>
存储在集合中的DataType:
public class BaseData
{
private String _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private string _value;
public string Value
{
get { return _value; }
set { _value = value; }
}
}
public class BoolData : BaseData
{
private bool _bool;
public bool ValueB
{
get { return _bool; }
set { _bool = value; }
}
}
public class StringData : BaseData
{
private string _string;
public string ValueS
{
get { return _string; }
set { _string = value; }
}
}
来自ViewModel&#34; Data&#34;的数据收集属性:
public class MainVm : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
List<BaseData> _data;
public List<BaseData> Data
{
get
{
if (null == _data)
{
_data = new List<BaseData>();
_data.Add(new BoolData() { Name="FirstBool", Value="True", ValueB = true });
_data.Add(new StringData() { Name="FirstString", Value="Hello", ValueS = "Hello" });
_data.Add(new BoolData() { Name="SecondBool", Value="False", ValueB = false });
_data.Add(new StringData() { Name="SecondString", Value="Goodbye", ValueS = "Goodbye" });
_data.Add(new BoolData() { Name="ThirdBool", Value="True", ValueB = true });
}
return _data;
}
}
}
(我应该提一下:这个例子显示我使用的CellEditingTemplateSelector与CellTemplateSelector相同。我认为这是有道理的,因为底层模板无论如何都是相同的。但我也尝试过使用完全不同的编辑选择器,没有编辑选择器,但没有任何帮助。)
答案 0 :(得分:1)
在编辑function ProjectCtrl($scope, $http, $timeout, $state, $stateParams) {
$http.get('../crud/projects_read.php').then(function(response){
$scope.projects = response.data;
});
};
function ProjectDetailCtrl($scope, $http, $timeout, $state, $stateParams) {
$scope.project_data = $scope.projects[$stateParams.project_id]
};
中的字段时,您应该将绑定的UpdateSourceTrigger
属性设置为PropertyChanged
,以便设置属性:
CellTemplate
<DataTemplate DataType="{x:Type local:StringData}" x:Key="StringTemplate" >
<TextBox Text="{Binding ValueS, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:BoolData}" x:Key="BoolTemplate" >
<CheckBox IsChecked="{Binding ValueB, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Background="Yellow"/>
</DataTemplate>
通常应该显示只读控件,而CellTemplate
应该显示输入字段。
这就是CellEditingTemplate
的工作原理。 DataGridTextColumn
中显示TextBlock
,CellTemplate
中显示TextBox
。