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

}

+1

“现在为什么这不起作用” - 你怎么知道它不工作?是什么让你认为这是一个绑定错误,例如在转换器中不是例外?请提供有关错误的更多信息。 – 3615

+0

就是这样,在输出窗口中没有错误+它没有错误地击中转换器。 – user1702369

+0

如果它打到转换器,那么绑定应该工作。你还可以发布ColorToBrushConverter吗? – 3615

作为Shawn Wildermuth states

渐变停止不自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)); 
    } 
} 

这输出看起来像这个:

enter image description here

+0

感谢您的支持 – user1702369

+0

欢迎您! – 3615

+0

FrameworkElement不需要绑定它的DependencyObject,否则我的好答案 – MikeT