2

У меня есть IMultivalueConverter, который обновляет цвет фона StackPanel, когда PropertyA или PropertyB изменен. Эти элементы управления создаются динамически.MultivalueConverter не вызван после DragDrop

Проблема: Я добавил два 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 и цвет фона обновляется.

Я не могу понять, почему только один элемент управления обновляется, когда оба принадлежат одному типу, а обработчик событий не равен нулю.

EDIT: Если я перетаскиваю значение ячейки из другого элемента управления (DevExpress DataGrid) в первую стеквую панель и затем изменяю свойство, фон не обновляется. Он отлично работает, пока я не перетаскиваю.

Update:

<StackPanel.Background> 
    <MultiBinding Converter="{StaticResource ResourceKey=BackgroundColorConverter}"> 
     <Binding Path="PropertyA" UpdateSourceTrigger="PropertyChanged" /> 
     <Binding Path="PropertyB" UpdateSourceTrigger="PropertyChanged" /> 
    </MultiBinding> 
</StackPanel.Background> 

Update 2: Я также попытался с помощью MultiDataTrigger вместо конвертера, но не может решить эту проблему.

+0

Можете ли вы разместить свой XAML, пожалуйста? –

+0

Можете ли вы точно определить, какие элементы управления создаются динамически и как PLS? – Usama

ответ

0

Если я не пропускаю вас понял, я не вижу каких-либо осложнений при этом, что,

<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)); 
    } 
} 

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

+0

Привет Сэм, U не поняли неправильно. Я отредактировал вопрос. Обновление теряется, когда я перетаскиваю его в стеке. – lerner1225

0

Причина:

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

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

Решение:

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

Смежные вопросы