2

我有一个更新时或更改时IMultivalueConverter的背景颜色。这些控件是动态创建的。StackPanelPropertyAPropertyB

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

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

对于第一个stackpanel背景颜色没有更新,但对于第二个stackpanelthis.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,但无法解决问题。

4

2 回答 2

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

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

于 2015-07-18T11:24:44.393 回答
0

原因:

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

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

解决方案:

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

于 2015-07-21T09:45:43.240 回答