WPF组合框颜色绑定问题
问题描述:
为了简单起见,我收集了颜色和绑定到它的组合框。工作,没有道具。WPF组合框颜色绑定问题
但是,当我想用一些渐变特征来扩展颜色时,绑定不起作用,我尝试了很多东西。我真的没有看到很大的区别。
这是我和它的工作:
XAML
<ComboBox x:Name="colorCombo" Style="{StaticResource myComboBoxStyle}" Height="25" ItemsSource="{Binding ColorCollection}" HorizontalAlignment="Left" Margin="5" Grid.Row="3" Grid.Column="4" Width="110">
<ComboBox.ItemTemplate>
<DataTemplate>
<Border Height="15" Width="{Binding ElementName=colorCombo, Path=Width}" Background="{Binding Converter={StaticResource ColorToBrushConverter} }"/>
</DataTemplate>
</ComboBox.ItemTemplate>
视图模型:
private Collection<Color> _colorCollection;
public Collection<Color> ColorCollection
{
get { return _colorCollection; }
set
{
_colorCollection = value;
this.NotifyPropertyChanged(x => x.ColorCollection);
}
}
视图模型收集得到填补的的OnLoad,所以不要担心关于那个。再次这是工作!
现在为什么会这样不行:
XAML
<ComboBox x:Name="colorCombo2" Style="{StaticResource myComboBoxStyle}" Height="25" ItemsSource="{Binding ColorCollection2}" HorizontalAlignment="Right" Margin="5" Grid.Row="3" Grid.Column="4" Width="110">
<ComboBox.ItemTemplate>
<DataTemplate>
<Border Height="15" Width="{Binding ElementName=colorCombo2, Path=Width}" BorderBrush="{Binding BorderColor, Converter={StaticResource ColorToBrushConverter}}" >
<Border.Background >
<LinearGradientBrush EndPoint="0.504,1.5" StartPoint="0.504,0.03">
<GradientStop Color="{Binding Color1, Converter={StaticResource ColorToBrushConverter}}" Offset="0"/>
<GradientStop Color="{Binding Color2, Converter={StaticResource ColorToBrushConverter}}" Offset="0.567"/>
</LinearGradientBrush>
</Border.Background>
</Border>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
视图模型:
private Collection<ColorGradientHelper> _colorCollection2;
public Collection<ColorGradientHelper> ColorCollection2
{
get { return _colorCollection2; }
set
{
_colorCollection2 = value;
this.NotifyPropertyChanged(x => x.ColorCollection2);
}
}
助手类:
Public class ColorGradientHelper:ObservableBase {
private Color _color1;
public Color Color1
{
get { return _color1; }
set
{
_color1 = value;
this.NotifyPropertyChanged(x => x.Color1);
}
}
private Color _color2;
public Color Color2
{
get { return _color2; }
set
{
_color2 = value;
this.NotifyPropertyChanged(x => x.Color2);
}
}
private Color _borderColor;
public Color BorderColor
{
get { return _borderColor; }
set
{
_borderColor = value;
this.NotifyPropertyChanged(x => x._borderColor);
}
}
转换器:
public class ColorToBrushConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
System.Drawing.Color col = (System.Drawing.Color) value;
Color c = Color.FromArgb(col.A, col.R, col.G, col.B);
return new SolidColorBrush(c);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
SolidColorBrush c = (SolidColorBrush) value;
System.Drawing.Color col = System.Drawing.Color.FromArgb(c.Color.A, c.Color.R, c.Color.G, c.Color.B);
return col;
}
}
答
渐变停止不自FrameworkElement派生因此不能被数据约束。
解决方法是FrameworkElement的the clever use of Tag
property。最后,灵感来自rmoore's answer我已经结束了与此解决方案:
XAML
<ComboBox x:Name="colorCombo2" Height="25" ItemsSource="{Binding ColorCollection}" HorizontalAlignment="Right" Margin="5" Width="110">
<ComboBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.Resources>
<local:ColorToBrushConverter x:Key="ColorToBrushConverter"/>
</Grid.Resources>
<Border Height="20" Width="{Binding ElementName=colorCombo2, Path=Width}"
BorderThickness="1"
BorderBrush="{Binding BorderColor, Converter={StaticResource ColorToBrushConverter}}">
<Border.Background>
<LinearGradientBrush EndPoint="0.504,1.5" StartPoint="0.504,0.03">
<GradientStop Color="{Binding ElementName=Border1, Path=Tag}" Offset="0" />
<GradientStop Color="{Binding ElementName=Border2, Path=Tag}" Offset="0.567" />
</LinearGradientBrush>
</Border.Background>
</Border>
<Grid Visibility="Collapsed">
<FrameworkElement Tag="{Binding Color1}" x:Name="Border1" />
<FrameworkElement Tag="{Binding Color2}" x:Name="Border2" />
</Grid>
</Grid>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
视图模型(与OP的视图模型相当一致)
public partial class MainWindow6 : Window, INotifyPropertyChanged {
public MainWindow6() {
DataContext = this;
InitializeComponent();
var colors = new Collection<ColorGradientHelper>();
colors.Add(new ColorGradientHelper {
BorderColor = Colors.Orange,
Color1 = Colors.Purple,
Color2 = Colors.White
});
colors.Add(new ColorGradientHelper {
BorderColor = Colors.Orange,
Color1 = Colors.Black,
Color2 = Colors.Yellow
});
ColorCollection = colors;
}
private Collection<ColorGradientHelper> _colorCollection;
public Collection<ColorGradientHelper> ColorCollection {
get {
return _colorCollection;
}
set {
_colorCollection = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
这输出看起来像这个:
“现在为什么这不起作用” - 你怎么知道它不工作?是什么让你认为这是一个绑定错误,例如在转换器中不是例外?请提供有关错误的更多信息。 – 3615
就是这样,在输出窗口中没有错误+它没有错误地击中转换器。 – user1702369
如果它打到转换器,那么绑定应该工作。你还可以发布ColorToBrushConverter吗? – 3615