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, но не смог решить проблему.


person lerner1225    schedule 17.07.2015    source источник
comment
Можете ли вы тоже опубликовать свой XAML, пожалуйста?   -  person Il Vic    schedule 17.07.2015
comment
Не могли бы вы уточнить, как какие элементы управления создаются динамически и как, пожалуйста?   -  person SamTh3D3v    schedule 18.07.2015


Ответы (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));
    }
}

дайте мне знать, если я что-то пропустил

person SamTh3D3v    schedule 18.07.2015
comment
Привет, Сэм, ты правильно понял. Я отредактировал вопрос. Обновление теряется, когда я перетаскиваю его в панель стека. - person lerner1225; 20.07.2015

Причина:

Когда значение перетаскивается на StackPanel, я устанавливаю BackgroundColor вручную.

stackpanel.BackGround = new SolidColorBrush(Color.FromArgb(255,255,255,141));

Решение:

Когда я прокомментировал эту строку, вызывается преобразователь MultiValue, и цвет фона обновляется правильно. Я создал свойство, которое изменяется в соответствии с событиями DragEnter, DragOver и DragLeave, а затем вызывается конвертер, я оцениваю это значение и устанавливаю цвет фона в конвертере.

person lerner1225    schedule 21.07.2015