2013-08-20 10 views
17

Mam klasy, która implementuje IValueConverter, który jest przeznaczony do konwersji wartości typu Boolean na Brush. Próbuję użyć IValueConverter w sposób wiążący do majątku Border Kontroli BorderBrush:Czy można użyć IValueConverter w wiązaniu na właściwość BorderBrush?

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

Oto kod dla własności domen w kodzie za:

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

Kiedy skompilować kod, który bynajmniej nie jest gotowy, pojawia się błąd kompilatora na BorderBrush oprawa:

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

Oto kod na 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)) { } 
} 

Czy ktoś może mi powiedzieć, co robię źle?

Odpowiedz

55

Trzeba użyć StaticResource dostęp do konwertera

Przykład:

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

Wiedziałem, że !!! Dzięki! –

+0

Oh wow. Teraz czuję się głupio. Dzięki @ sa_ddam213, zrobiłeś mój dzień! :-) – BrainSlugs83

+0

Czuję się dokładnie jak powyżej dwóch komentarzy, a także w tym samym czasie. –

Powiązane problemy