Редактировать: я создал пример проекта, показывающий, что я сделал, а что нет. https://github.com/jmooney5115/clear-multibinding
У меня есть приложение WPF с элементами управления (текстовое поле, сетка данных и т. Д.). Когда значение изменяется в элементе управления, мне нужно указать его, изменив цвет фона. После сохранения изменений цвет фона необходимо вернуть в неизмененное состояние без перезагрузки элемента управления. Это приложение не MVVM, не судите, я унаследовал его.
У меня отлично работает код для изменения цвета с помощью MultiBinding и преобразователя значений. Проблема в том, что я не могу понять, как сбросить фон после вызова Save () в моем коде. Я попытался сделать DataContext = null, а затем DataContext = это, но элемент управления мигает. Должен быть лучший способ.
В: как я могу сбросить фон в неизмененное состояние без перезагрузки элемента управления?
MultiBinding XAML - это работает путем передачи строки [] в BackgroundColorConverter. Строка [0] является привязкой OneTime. Строка 1 является другой привязкой.
<TextBox.Background>
<MultiBinding Converter="{StaticResource BackgroundColorConverter}">
<Binding Path="DeviceObj.Name" />
<Binding Path="DeviceObj.Name" Mode="OneTime" />
</MultiBinding>
</TextBox.Background>
BackgroundColorConverter.cs
/// <summary>
/// /1052838/izmenit-tsvet-fona-dlya-tekstovogo-polya-wpf-v-izmenennom-sostoyanii
///
/// Property changed
/// </summary>
public class BackgroundColorConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var colorRed = (System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#FFB0E0E6");
var colorWhite = (System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("White");
var unchanged = new SolidColorBrush(colorWhite);
var changed = new SolidColorBrush(colorRed);
if (values.Length == 2)
if (values[0].Equals(values[1]))
return unchanged;
else
return changed;
else
return changed;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Обновление
Редактировать: это мульти-привязка для ячейки сетки данных. Если конвертер нескольких связей возвращает значение true, установите цвет фона на LightBlue. Если false, фон является цветом по умолчанию.
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >
<!-- /4185578/problema-pri-smeshivanii-konvertera-multibinding-i-triggera-v-stile -->
<DataGridTextColumn.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource BackgroundColorConverterBool}">
<Binding Path="Name" />
<Binding Path="Name" Mode="OneTime" />
</MultiBinding>
</DataTrigger.Binding>
</DataTrigger>
<Setter Property="Background" Value="LightBlue"></Setter>
</Style.Triggers>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
.
.
.
</DataGrid.Columns>
Я сделал этот метод для сброса привязки объектов после сохранения.
/// <summary>
/// Update the data binding after a save to clear the blue that could be there when
/// a change is detected.
/// </summary>
/// <typeparam name="T">Type to search for</typeparam>
/// <param name="parentDepObj">Parent object we want to reset the binding for their children.</param>
public static void UpdateDataBinding<T>(DependencyObject parentDepObj) where T : DependencyObject
{
if (parentDepObj != null)
{
MultiBindingExpression multiBindingExpression;
foreach (var control in UIHelper.FindVisualChildren<T>(parentDepObj))
{
multiBindingExpression = BindingOperations.GetMultiBindingExpression(control, Control.BackgroundProperty);
if (multiBindingExpression != null)
multiBindingExpression.UpdateTarget();
}
}
}
Окончательное обновление
Этот вопрос отвечает на вопрос, как использовать MultiBinding для моей цели на DataGridCell: Обновить MultiBinding на DataGridCell