Столбцы DataGrid не обновляют значения с помощью DataGrid2D. - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь привязать столбцы и строки DataGrid к тому же источнику, но DataGrid не показывает новое значение в ColumnHeader, когда я изменяю значение в RowHeader после TextBox потери фокуса. Коллекция заголовков содержит новые значения, как и ожидалось.

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>

DataContext:

public class MainViewModel
{
    public IEnumerable<Header> Headers { get; } = new Header[]
    { new Header { Value = "1" }, new Header { Value = "2" } };
    public string[,] Items { get; } = new string[2, 2] { { "1", "2" }, { "3", "4" } };
}
public class Header
{
    public string Value { get; set; }

    public override string ToString()
    {
        return Value;
    }
}

Что я делаю не так?

Я изменяю свойство Value со стороны просмотра, поэтому для него не требуется интерфейс INotifyPropertyChanged. Если я вызываю «Обновить» в DataGrid, он обновляется, но мигает.

Edit:

Почему вы отрицаете меня? Это плохой вопрос?

1 Ответ

0 голосов
/ 30 октября 2018

Вот одно из возможных решений с использованием стиля для 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));
            }
        }
    }
...