在DragDrop

时间:2015-07-17 13:49:23

标签: wpf drag-and-drop inotifypropertychanged imultivalueconverter devexpress-wpf

我有一个IMultivalueConverter,当StackPanelPropertyA发生变化时会更新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并更新背景颜色。

我无法理解为什么只有一个控件在属于同一类型并且eventhandler不为null时才会更新。

编辑: 如果我将其他控件(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 个答案:

答案 0 :(得分: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));
    }
}

让我知道我是否错过了什么

答案 1 :(得分:0)

原因:

当在StackPanel上拖动一个值时,我手动设置BackgroundColor。

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

解决方案:

当我评论此行时,将调用MultiValue转换器并正确更新BackGround颜色。 我创建了一个根据DragEnter,DragOver和DragLeave事件更改的属性,然后调用转换器,我评估此值并在转换器中设置背景颜色。