DataGrid列不使用DataGrid2D

时间:2018-10-26 18:22:35

标签: c# wpf binding datagrid datagridcolumnheader

我试图将DataGrid的列和行绑定到相同的源,但是当我在{{1之后}更改ColumnHeader中的值时,DataGrid在RowHeader中不显示新值}}失去了焦点。标头集合包含预期的新值。

TextBox

DataContext:

xmlns:dataGrid2D="http://gu.se/DataGrid2D"

<Grid>
    <DataGrid
        dataGrid2D:ItemsSource.RowHeadersSource="{Binding Headers}"
        dataGrid2D:ItemsSource.ColumnHeadersSource="{Binding Headers}"
        dataGrid2D:ItemsSource.Array2D="{Binding Items}"
        IsReadOnly="True"
        AutoGenerateColumns="True">
        <DataGrid.RowHeaderTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Value}" />
            </DataTemplate>
        </DataGrid.RowHeaderTemplate>
    </DataGrid>
</Grid>

我做错了什么?

我正在从View端更改Value属性,因此它不需要INotifyPropertyChanged接口。如果我在DataGrid上调用“刷新”,它会更新但会闪烁。

编辑:

你为什么要拒​​绝我?这是一个不好的问题吗?

1 个答案:

答案 0 :(得分:1)

这是使用DataGridColumnHeader样式的一种可能的解决方案。我还明确使用了Value属性而不是ToString方法。

<Grid>
    <DataGrid
    dataGrid2D:ItemsSource.RowHeadersSource="{Binding Headers}"
    dataGrid2D:ItemsSource.ColumnHeadersSource="{Binding Headers}"
    dataGrid2D:ItemsSource.Array2D="{Binding Items}"
    IsReadOnly="True"
    AutoGenerateColumns="True">
        <DataGrid.Resources>
            <Style TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <TextBlock Text="{Binding Value}"/>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.Resources>
        <DataGrid.RowHeaderTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}"/>
            </DataTemplate>
        </DataGrid.RowHeaderTemplate>
    </DataGrid>
</Grid>

然后您需要稍微更改ModelView:

    public class Header: INotifyPropertyChanged
    {
        private string _Value;

        public string Value
        {
            get
            {
                return _Value;
            }
            set
            {
                _Value = value;
                OnPropertyChanged("Value");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }