У меня есть симпатичная маленькая сетка данных, и я пытаюсь внедрить систему «грязных флагов».Флаги корректно обновляются всякий раз, когда я изменяю значение вручную, но когда я сохраняю свои изменения в базе данных, флаги остаются активированными.
Вот соответствующий 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()
тогда не вызывается.
Как я могу заставить пользовательский интерфейс отображать сохраненные изменения после нажатия кнопки сохранения?