2013-08-20 3 views
17

Ich habe eine Klasse, die IValueConverter implementiert, die verwendet werden soll, um einen booleschen Wert in eine Brush zu konvertieren. Ich versuche, die IValueConverter in eine Bindung an die BorderBrush Eigenschaft eines Border Steuerung:Können Sie einen IValueConverter in einer Bindung für die BorderBrush-Eigenschaft verwenden?

<Window x:Class="DomPicker.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:cc="clr-namespace:CustomControls;assembly=CustomControls" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     DataContext="{Binding Path=Domains, RelativeSource={RelativeSource Self}}" 
     Height="350" 
     Title="My Title" 
     Width="525"> 

    <cc:CarSystemWindow.Resources> 
     <cc:BooleanToBrushConverter x:Key="BrushConverter" True="Black" False="Transparent" /> 

     <DataTemplate x:Name="DomainTemplate" DataType="DomainViewModel"> 
      <Border BorderBrush="{Binding Converter=BrushConverter, Path=IsSelected}"> 
       . . . 
      </Border> 
     </DataTemplate> 
    </cc:CarSystemWindow.Resources> 

    <Grid> 
     <ListBox . . . Name="DomainListBox" /> 
    </Grid> 
<Window> 

Hier ist der Code für die Domains Eigenschaft im Code hinter:

public static readonly DependencyProperty DomainsProperty = 
    DependencyProperty.Register("Domains", typeof(ObservableCollection<DomainViewModel>), typeof(MainWindow), new PropertyMetadata(null)); 

public ObservableCollection<DomainViewModel> Domains { 
    get { return (ObservableCollection<DomainViewModel>) GetValue(DomainsProperty); } 
    set { SetValue(DomainsProperty, value); } 
} 

Wenn ich kompilieren der Code, der durch kein Mittel ist fertig, bekomme ich einen Compiler-Fehler auf der BorderBrush Bindung:

The TypeConverter for "IValueConverter" does not support converting from a string. 

Hier ist der Code für die IValueConverter:

public class BooleanConverter<T> : IValueConverter { 

    public T False { get; set; } 
    public T True { get; set; } 

    public BooleanConverter(T trueValue, T falseValue) { 
     // Set the values of True and false to the values we were passed. 
     True = trueValue; 
     False = falseValue; 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
     return value is bool && ((bool) value) ? True : False; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { 
     return value is T && EqualityComparer<T>.Default.Equals((T) value, True); 
    } 
} 

[ValueConversion(typeof(bool), typeof(Brush))] 
public class BooleanToBrushConverter : BooleanConverter<Brush> { 

    /// <summary> 
    /// Set us up so we convert true to a Black <see cref="SolidColorBrush"/> and 
    /// false to a Red SolidColorBrush. 
    /// </summary> 
    public BooleanToBrushConverter() : 
     base(new SolidColorBrush(Colors.Black), new SolidColorBrush(Colors.Red)) { } 
} 

Kann mir jemand sagen, was ich falsch mache?

Antwort

55

Sie müssen StaticResource benutzen, um Ihre Konverter

Beispiel zuzugreifen:

<Border BorderBrush="{Binding IsSelected, Converter={StaticResource BrushConverter}}"> 
+1

ich wusste, dass !!! Vielen Dank! –

+0

Oh wow. Ich fühle mich jetzt dumm. Danke @ sa_ddam213, du hast meinen Tag gemacht! :-) – BrainSlugs83

+0

Ich fühle mich genau wie oben zwei Kommentare und das auch gleichzeitig. –