IValueCONverter не работает

Гуглил эту проблему часами и не вижу, где я ошибаюсь.

У меня есть следующий преобразователь, который просто возвращает Brushes.Red (также пробовал Colors.Red), но все равно не повезло.

public class ColorConverter : IValueConverter
{
    private static ColorConverter instance = new ColorConverter();
    public static ColorConverter Instance
    {
        get
        {
            return instance;
        }
    }

    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 Exception("The method or operation is not implemented.");
    }
}

Теперь в моем xaml у меня есть следующий код:

<StackPanel Orientation="Vertical">
    <TextBlock Text="{Binding Value}" TextAlignment="Center" Foreground="{Binding Path=color, Converter={x:Static local:ColorConverter.Instance}}" Margin="2"/>
</StackPanel>

Я установил следующее пространство имен вверху:

xmlns:local="clr-namespace:Dashboard"

Теперь у меня есть следующий класс, привязанный к панели стека:

public class MyClass : INotifyPropertyChanged
{
    public String Value;
    public Color color;

    // Declare the PropertyChanged event
    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}

Привязка данных (значение) работает отлично, но конвертер не хочет запускаться, я пытался установить точку останова в методе Convert ковнертера, но это не срабатывает при отладке, просто кажется, что мой отладчик не вызывается.

Может кто-нибудь пролить некоторый свет на это?


person Michal Ciechan    schedule 11.02.2010    source источник


Ответы (2)


Я удивлен, что вы говорите, что сама привязка работает, потому что «Значение» и «цвет» являются полями, а привязка к полям не должна работать.

person Daniel Pratt    schedule 11.02.2010
comment
да, я даже не удосужился посмотреть на их декларации, потому что это звучало как все, но конвертер работал. :) - person Dave; 11.02.2010

Вот как я это сделал в своем проекте. Я изменил свой код, чтобы отразить то, что вы пытаетесь сделать. Я надеюсь, что это помогает. Я не могу ответить, почему ваш одноэлементный подход не сработает.

Класс:

public class ColorConverter : 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 Exception("The method or operation is not implemented.");
    }
}

В моем элементе UserControl.Resources:

<UserControl.Resources>
    <local:ColorConverter x:Key="MyColorConverter" />
</UserControl.Resources>

Элемент StackPanel:

<StackPanel Orientation="Vertical">
    <TextBlock Text="{Binding Value}" TextAlignment="Center" Foreground="{Binding Path=color, Converter={StaticResource MyColorConverter}}" Margin="2"/>
</StackPanel>

Кроме того, вы проверили окно вывода, чтобы увидеть, есть ли какие-либо ошибки? Вам также следует прочитать статью Беа Столлниц об отладке привязок данных. На самом деле у нее есть специальный раздел по IValueConverters, который может когда-нибудь вам пригодиться.

person Dave    schedule 11.02.2010
comment
Спасибо за это! Обнаружил проблему после входа в окно вывода. Я не знал, что для того, чтобы сделать переменную свойством, нужно добавить { set; получить; } к нему. Так что у меня их там не было, и вывод жаловался, что не может найти свойство цвета. Очень ценю помощь, и спасибо за ссылку. Добавлено в избранное! - person Michal Ciechan; 11.02.2010
comment
ах да, вы использовали поле вместо свойства. Я совершал эту ошибку раньше (и, по-видимому, только что сделал снова). :) - person Dave; 11.02.2010