【问题标题】:MultivalueConverter not called after DragDrop在 DragDrop 之后未调用 MultivalueConverter
【发布时间】:2015-07-17 13:49:22
【问题描述】:

我有一个IMultivalueConverter,当PropertyAPropertyB 更改时,它会更新StackPanel 的背景颜色。这些控件是动态创建的。

问题: 我添加了两个StackPanels,并在单击按钮时更改了代码中的PropertyA。这会导致属性更改事件。

private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
   if (this.PropertyChanged != null)
   {
     this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
   }
}

对于第一个stackpanel,背景颜色不会更新,但对于第二个stackpanel,this.PropertyChanged 会调用我的 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,但无法解决问题。

【问题讨论】:

  • 请您也发布您的 XAML 吗?
  • 您能否详细说明动态创建哪些控件以及如何创建?

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


【解决方案1】:

除非我想念理解你,否则我认为这样做没有任何复杂性,

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

如果我错过了什么,请告诉我

【讨论】:

  • 嗨山姆,你没有误解。我已经编辑了这个问题。当我拖放到堆栈面板中时,更新会丢失。
【解决方案2】:

原因:

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

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

解决方案:

当我评论这一行时,MultiValue 转换器被调用并且背景颜色被正确更新。 我创建了一个根据 DragEnter、DragOver 和 DragLeave 事件发生变化的属性,然后调用转换器,我评估这个值并在转换器中设置背景颜色。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-30
    • 2013-06-06
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多