Перечисление на кисти в разделе ivalueconverter бросает исключение при попытке бросить системы.Строка в IValueConverter?
Я пытаюсь преобразовать перечисление в кисть, чтобы переменная enum могла использоваться для управления цветом некоторого элемента управления
Мое перечисление (не совсем уместно):
public enum Colors {
Red, Blue,
}
Вот мой конвертер:
[ValueConversion(typeof(Colors), typeof(Brush))]
public class EnumToBrushConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
return (Brushes.Red);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
throw new NotImplementedException();
}
}
Здесь я пытаюсь использовать его для изменения цвета метки на основе значения перечисления (цвет является общим свойством типа Colors):
<Grid>
<Grid.Resources>
<conv:EnumToBrushConverter x:Key="EnumToBrushConverter" />
</Grid.Resources>
<Label Content="fixed" Foreground="{Binding Path=Color, Converter=EnumToBrushConverter}" />
</Grid>
Когда окно построено, я получаю следующее исключение:
System.Windows.Markup.XamlParseException occurred
Message='Set property 'System.Windows.Data.Binding.Converter' threw an exception.' Line number '9' and line position '11'.
Source=PresentationFramework
LineNumber=9
LinePosition=11
StackTrace:
at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri)
at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
at TestCollectionChangingListbox.MainWindow.InitializeComponent() in c:UsersstevezDocumentsVisual Studio 2010ProjectsTestCollectionChangingListboxTestCollectionChangingListboxMainWindow.xaml:line 1
at TestCollectionChangingListbox.MainWindow..ctor() in C:UsersstevezDocumentsVisual Studio 2010ProjectsTestCollectionChangingListboxTestCollectionChangingListboxMainWindow.xaml.cs:line 29
InnerException: System.InvalidCastException
Message=Unable to cast object of type 'System.String' to type 'System.Windows.Data.IValueConverter'.
Source=PresentationFramework
StackTrace:
at System.Windows.Baml2006.WpfSharedBamlSchemaContext.<Create_BamlProperty_Binding_Converter>b__14c(Object target, Object value)
at System.Windows.Baml2006.WpfKnownMemberInvoker.SetValue(Object instance, Object value)
at MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(XamlMember member, Object obj, Object value)
at MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(Object inst, XamlMember property, Object value)
InnerException:
2 ответа:
Вам нужно получить доступ к вашему конвертеру как к статическому ресурсу; попробуйте сделать следующее:
<Label Content="fixed" Foreground="{Binding Path=Color, Converter={StaticResource EnumToBrushConverter}}" />
Вам нужно будет создать экземпляр этого конвертера в разделе Ресурсы соответствующего элемента управления (или в приложении.xaml файл, если вы хотите использовать конвертер в нескольких местах в вашем приложении):
<UserControl.Resources> <local:EnumToBrushConverter x:Key="EnumToBrushConverter " /> </UserControl.Resources>
И затем ссылайтесь на этот преобразователь как на статический ресурс:
<Label Content="fixed" Foreground="{Binding Path=Color, Converter={StaticResource EnumToBrushConverter}" />