我有一个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并更新背景颜色。
我无法理解为什么只有一个控件在属于同一类型并且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,但无法解决问题。
答案 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事件更改的属性,然后调用转换器,我评估此值并在转换器中设置背景颜色。