DataGrid与DataGridTemplateColumn无法更新

时间:2017-08-08 19:06:09

标签: wpf data-binding datagrid

我有一个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相同。我认为这是有道理的,因为底层模板无论如何都是相同的。但我也尝试过使用完全不同的编辑选择器,没有编辑选择器,但没有任何帮助。)

1 个答案:

答案 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中显示TextBlockCellTemplate中显示TextBox