Сетка данных не обновляет интерфейс с новыми значениями - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть симпатичная маленькая сетка данных, и я пытаюсь внедрить систему «грязных флагов».Флаги корректно обновляются всякий раз, когда я изменяю значение вручную, но когда я сохраняю свои изменения в базе данных, флаги остаются активированными.

Вот соответствующий XAML для моей DataGrid:

 <DataGrid Margin="20" AutoGenerateColumns="False" Name="MasterDataGrid" ScrollViewer.VerticalScrollBarVisibility="Visible" SelectionChanged="MasterDataGrid_SelectionChanged" AlternationCount="2" DockPanel.Dock="Top" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto"  >
        <DataGrid.Columns>

            <DataGridTextColumn x:Name="NameColumn"  IsReadOnly="True" Header="Name" Binding="{Binding Name}" />

            <!--<DataGridTextColumn Header="Value" Binding="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=Explicit}">

                <DataGridTextColumn.Foreground>
                    <MultiBinding Converter="{StaticResource MvcForeground}">
                        <Binding Path="Value" />
                        <Binding Path="DefaultValue"/>
                    </MultiBinding>
                </DataGridTextColumn.Foreground>
            </DataGridTextColumn>-->

            <DataGridTemplateColumn Header="Value">
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <Grid FocusManager.FocusedElement="{Binding ElementName=textBox1}">
                            <TextBox Name="textBox1" GotFocus="TextBox1_OnGotFocus" Margin="0" Padding="-2" MaxHeight="29"  Text="{Binding Path=TemporaryValueFromUser, Mode=TwoWay, UpdateSourceTrigger=Explicit}"/>
                        </Grid>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
                <DataGridTemplateColumn.CellTemplate >
                    <DataTemplate>
                        <TextBlock Name="ValueTextBlock"  Text="{Binding Path=TemporaryValueFromUser, Mode=TwoWay,UpdateSourceTrigger=Explicit}">
                            <TextBlock.Style>
                                <Style TargetType="TextBlock">
                                    <Setter Property="Foreground">
                                        <Setter.Value>
                                            <MultiBinding Converter="{StaticResource MvcForeground}">
                                                <Binding Path="TemporaryValueFromUser" />
                                                <Binding Path="StoredValue"/>
                                            </MultiBinding>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </TextBlock.Style>
                        </TextBlock>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn IsReadOnly="True" Header="Stored Value" Binding="{Binding StoredValue, UpdateSourceTrigger=PropertyChanged}"/>

            <DataGridTextColumn IsReadOnly="True" Header="Default Value" Binding="{Binding DefaultValue}"/>


        </DataGrid.Columns>
</DataGrid>

Основное внимание здесь уделяется столбцу «Значение», а также столбцу «StoredValue» в некоторой степени.

Мой C # находится в выделенном коде, поэтому дополнительный контекст данных не требуется.

Вот преобразователь нескольких значений, используемый в XAML:

public class MvcForeground : IMultiValueConverter
{
    public object Convert(object[] values, System.Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        //var changed = Brushes.Red;
        var changed = Brushes.Red;
        var unchanged = Brushes.Black;
        if (values[0] == null || values[1] == null)
        {
            return unchanged;
        }
        if (values.Count() == 2)
        {
            if (values[0].Equals(values[1]))

                return unchanged;
            else
                return changed;
        }
        else
            return unchanged;
    }

    public object Reset()
    {
        return Brushes.Black;
    }

    public object[] ConvertBack(object value, System.Type[] targetTypes, object parameter,
        System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Вот мой метод сохранения изменений:

 private void SaveButton_Click(object sender, RoutedEventArgs e)
    {
        foreach (CmcdConfigurationParameter cp in MasterDataGrid.ItemsSource)
        {

            cp.StoredValue = cp.TemporaryValueFromUser;

        }
        _objDbContext.SaveChanges();
        RaiseEvent(new RoutedEventArgs(SaveConfigChangesEvent));
        MessageBox.Show("Changes have been saved to database");
    }

Преобразователь значений работает правильно, иметод save действительно записывает в базу данных, единственная проблема состоит в том, что пользовательский интерфейс не обновляется после факта, возможно, потому что метод Convert() тогда не вызывается.

Как я могу заставить пользовательский интерфейс отображать сохраненные изменения после нажатия кнопки сохранения?

1 Ответ

0 голосов
/ 20 сентября 2018

Поскольку вы не используете шаблон MVVM с уведомлениями PropertyChanged, необходимо повторно привязать сетку к данным ItemsSource.

В конце метода SaveButton_Click вам нужно что-то вроде следующего:

MasterDataGrid.ItemsSource = MasterDataGrid.ItemsSource.Cast<object>.ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...