MultivalueConverter не вызывается после DragDrop
У меня есть IMultivalueConverter
который обновляет цвет фона StackPanel
когда PropertyA
или же PropertyB
изменено Эти элементы управления создаются динамически.
Проблема: я добавил два StackPanels
и изменил PropertyA
в коде при нажатии кнопки. Это приводит к изменению свойства события.
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
Для первого stackpanel
цвет фона не обновляется, но для второго stackpanel
this.PropertyChanged inturn вызывает мой MultiValueConverter, и цвет фона обновляется.
Я не могу понять, почему обновляется только один элемент управления, когда оба принадлежат одному типу, а обработчик событий не равен нулю.
РЕДАКТИРОВАТЬ: если я перетащить значение ячейки из другого элемента управления (DevExpress DataGrid) в первую панель стека, а затем изменить свойство, фон не обновляется. Работает нормально, пока не перетащу.
Обновить:
<StackPanel.Background>
<MultiBinding Converter="{StaticResource ResourceKey=BackgroundColorConverter}">
<Binding Path="PropertyA" UpdateSourceTrigger="PropertyChanged" />
<Binding Path="PropertyB" UpdateSourceTrigger="PropertyChanged" />
</MultiBinding>
</StackPanel.Background>
Обновление 2: я также попытался использовать MultiDataTrigger вместо Converter, но не смог решить проблему.
2 ответа
Если я не скучаю по тебе, я не вижу никаких сложностей в этом,
<Window.Resources>
<app:BackgroundColorConverter x:Key="BackgroundColorConverter"/>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" >
<TextBox Text="{Binding PropertyA}" Width="200"/>
<TextBox Text="{Binding PropertyB}" Width="200"/>
</StackPanel>
<StackPanel Grid.Row="1" Margin="5">
<StackPanel.Background>
<MultiBinding Converter="{StaticResource ResourceKey=BackgroundColorConverter}">
<Binding Path="PropertyA" UpdateSourceTrigger="PropertyChanged" />
<Binding Path="PropertyB" UpdateSourceTrigger="PropertyChanged" />
</MultiBinding>
</StackPanel.Background>
</StackPanel>
<StackPanel Grid.Row="2" Margin="5">
<StackPanel.Background>
<MultiBinding Converter="{StaticResource ResourceKey=BackgroundColorConverter}">
<Binding Path="PropertyA" UpdateSourceTrigger="PropertyChanged" />
<Binding Path="PropertyB" UpdateSourceTrigger="PropertyChanged" />
</MultiBinding>
</StackPanel.Background>
</StackPanel>
</Grid>
Конвертер:
public class BackgroundColorConverter:IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values==null)
{
return null;
}
return
new SolidColorBrush(Color.FromRgb(byte.Parse(values[0].ToString()), byte.Parse(values[1].ToString()),
50));
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
..И Кодекс позади
public partial class MainWindow : Window,INotifyPropertyChanged
{
private byte _propertyA ;
private byte _propertyB;
public byte PropertyA
{
get
{
return _propertyA;
}
set
{
if (_propertyA == value)
{
return;
}
_propertyA = value;
OnPropertyChanged();
}
}
public byte PropertyB
{
get
{
return _propertyB;
}
set
{
if (_propertyB == value)
{
return;
}
_propertyB = value;
OnPropertyChanged();
}
}
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
дайте мне знать, если я что-то пропустил
Причина:
Когда значение перетаскивается через StackPanel, я устанавливаю BackgroundColor вручную.
stackpanel.BackGround = new SolidColorBrush(Color.FromArgb(255,255,255,141));
Решение:
Когда я прокомментировал эту строку, вызывается конвертер MultiValue и цвет BackGround корректно обновляется. Я создал свойство, которое изменяется в соответствии с событиями DragEnter, DragOver и DragLeave, а затем вызывается конвертер, оцениваю это значение и устанавливаю цвет фона в конвертере.