C# SolidColorBrush颜色绑定问题
因此,我的ObjA类上的“groupcolor”属性存在一些绑定问题。我还有一个CurrentState变量,它根据其值返回一个笔刷(这在下面的转换器中完成) 它用于我在视图XAML中创建的按钮的ControlTemplate触发器中C# SolidColorBrush颜色绑定问题,c#,wpf,xaml,C#,Wpf,Xaml,因此,我的ObjA类上的“groupcolor”属性存在一些绑定问题。我还有一个CurrentState变量,它根据其值返回一个笔刷(这在下面的转换器中完成) 它用于我在视图XAML中创建的按钮的ControlTemplate触发器中 <ControlTemplate.Triggers> <Trigger Property="IsChecked" Value="true">
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="true">
<Setter Property="Background" Value="{Binding CurrentState, Converter={StaticResource StateToColorConverter}}"/>
</Trigger>
<Trigger Property="IsChecked" Value="False">
<Setter Property="Background" Value="{Binding CurrentState, Converter={StaticResource StateToColorConverter}}"/>
</Trigger>
</ControlTemplate.Triggers>
这一切似乎都很好,但我得到一个XAML错误
System.Windows.Data错误:2:找不到治理框架元素
或目标元素的FrameworkContentElement。
BindingExpression:Path=groupcolor;DataItem=null;目标元素是
“SolidColorBrush”(HashCode=46663997);目标属性为“颜色”
(键入“颜色”)
我不知道为什么…对不起,我的答案无法解决您的问题
System.Windows.Data错误:2:找不到目标元素的治理FrameworkElement或FrameworkContentElement。BindingExpression:Path=groupcolor;DataItem=null;目标元素是“SolidColorBrush”(HashCode=46663997);目标属性为“Color”(键入“Color”)
我认为您的代码不会发送此消息,我需要更多代码
但是您的转换器在此代码中返回颜色返回笔刷.Transparent.Color
。它将背景值类型设置为笔刷的背景颜色
当您打开“调试输出”窗口时,它还将发送绑定消息
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=CurrentState; DataItem=null; target element is 'Grid' (Name=''); target property is 'Background' (type 'Brush')
如何修复它?尝试替换将笔刷.Transparent.Color
返回到笔刷.Transparent
,您可以看到此代码
switch (value)
{
case State.INACTIVE:
return Utilities.ResourceDictionary["HoverOverColourInactive"] as Brush;
case State.ACTIVE:
return Utilities.ResourceDictionary["HoverOverColourActive"] as Brush;
case State.ACTIVE_GROUP_SET:
return Utilities.ResourceDictionary["BackgroundBasedOnGroupColour"] as Brush;
case State.HIGHLIGHTED:
return Utilities.ResourceDictionary["HighlightThemeColour"] as Brush;
case State.PROCESSING:
return Utilities.ResourceDictionary["ProcessingWellColour"] as Brush;
default:
- return Brushes.Transparent.Color;
+ return Brushes.Transparent;
}
当您在xaml中简单地选择一种颜色时,WPF将通过隐式转换器自动运行您的颜色,以将其包装在画笔中。由于您提供自己的转换器,您将无法再从隐式WPF中获益,因此您需要自己返回画笔
这是您的示例,其中仅在各行中添加了“new SolidColorBrush”以满足背景绑定
public class StateToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
switch (value)
{
case State.INACTIVE:
return new SolidColorBrush(Utilities.ResourceDictionary["HoverOverColourInactive"]);
case State.ACTIVE:
return new SolidColorBrush(Utilities.ResourceDictionary["HoverOverColourActive"]);
case State.ACTIVE_GROUP_SET:
return new SolidColorBrush(Utilities.ResourceDictionary["BackgroundBasedOnGroupColour"]);
case State.HIGHLIGHTED:
return new SolidColorBrush(Utilities.ResourceDictionary["HighlightThemeColour"]);
case State.PROCESSING:
return new SolidColorBrush(Utilities.ResourceDictionary["ProcessingWellColour"]);
default:
return Brushes.Transparent;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
您可以改为使用MultiTriggers,在这里您可以在XAML中声明控件的当前状态和选中状态的各种组合。您应该返回SolidColorBrush
,而不是Brush
。谢谢大家:)我将尝试一下CurrentState
属性定义在哪里按钮的DataContext
?在mm8成功修复了它,我不得不移除我的转换器并使用我的groupcolor
属性,它是一个solidcolorbush
。。。。不过有点烦人,因为转换器返回一个SolidColorBrush
…谢谢lindexi。为什么人们投票反对?如果有人能告诉我一个问题应该怎么问,我会很感激的,因为我使用的是提出问题的指导原则。。。Wth@uaswpf我不知道为什么。但我想我忘了点击向上投票,我会点击向上投票。
public class StateToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
switch (value)
{
case State.INACTIVE:
return new SolidColorBrush(Utilities.ResourceDictionary["HoverOverColourInactive"]);
case State.ACTIVE:
return new SolidColorBrush(Utilities.ResourceDictionary["HoverOverColourActive"]);
case State.ACTIVE_GROUP_SET:
return new SolidColorBrush(Utilities.ResourceDictionary["BackgroundBasedOnGroupColour"]);
case State.HIGHLIGHTED:
return new SolidColorBrush(Utilities.ResourceDictionary["HighlightThemeColour"]);
case State.PROCESSING:
return new SolidColorBrush(Utilities.ResourceDictionary["ProcessingWellColour"]);
default:
return Brushes.Transparent;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}