none
Как прибиндить значение типа Brush? RRS feed

  • Вопрос

  • Добрый день!

    Мне не удается организовать правильный биндинг для свойства Foreground TextBlock-a. Делаю так:

    <Window
    ...
                 DataContext="{Binding ReesterPaymentsViewModel, Source={StaticResource Locator}}" Width="250"
                 Title="Чтение реестров" WindowStyle="ToolWindow" x:Name="DialogWin"  >
      <Window.Resources>
            <local:BoolToVisibilityConverter x:Key="bool2VisibilityConverter"/>
            <local:BoolToBrushConverter x:Key="bool2BrushConverter"/>
        </Window.Resources>
    ...
       <TextBlock Text="{Binding sReestrId}" HorizontalAlignment="Center" TextAlignment="Center" Grid.Row="0" VerticalAlignment="Center"
                       Foreground="{Binding IsError, Converter={StaticResource bool2BrushConverter}}" />
       <TextBlock Text="Error!" HorizontalAlignment="Right" TextAlignment="Center" Grid.Row="0" VerticalAlignment="Center"
                       Visibility="{Binding IsError, Converter={StaticResource bool2VisibilityConverter}}" />
    ...
    </Window>
     

    в классе ReesterPaymentsViewModel объявлены свойства и конвертеры:

    bool _IsError = false; public bool IsError { get { return _IsError; } set { _IsError = value; RaisePropertyChanged(() => IsError); } }

        string _sReestrId;
            public string sReestrId
            {
                get { return _sReestrId; }
                set
                {
                    _sReestrId = value;
                    RaisePropertyChanged(() => sReestrId);
                }
            }
        public class BoolToVisibilityConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                if (value is bool)
                { return ((bool)value) ? Visibility.Visible : Visibility.Hidden; }
                return Visibility.Collapsed;
            }
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                if (value is Visibility)
                { if ((Visibility)value == Visibility.Visible) return true; }
                return false;
            }
        }
    
        public class BoolToBrushConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                if (value is bool)
                { return ((bool)value) ? Brushes.Red : Brushes.Green; }
                return Brushes.Green;
            }
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                if (value is Brush)
                { if (value as Brush == Brushes.Red) return true; }
                return false;
            }
        }

    И вот. Vsibility у текстблока устанавливается, текст меняется, а Foreground - нет. Я его пробовал и без конвертера ставить, делал свойство типа Brush - нет реакции. Цвет текста остается черным, хотя брекпойнт на функцию
    BoolToBrushConverter.Convert приходит. IsError в программе сначала равен false, потом true.

    Отчего такое, подскажите? Brush сильно сложнее строки или Visibility?

    Заранее спасибо.

    20 октября 2016 г. 9:37

Ответы

  • Здравствуйте,

    Не один в один конечно, но вто схожая тема, смотрите ответ PawelSt:

    How can I bind Foreground to a property in my ViewModel?


    Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение" Мнения, высказанные здесь, являются отражение моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    21 октября 2016 г. 6:55
    Модератор
  • Откровенно говоря не охота вспоминать почему привязка не подхватывает элементы из набора, но решается это очень просто. Вместо Brushes.Red, пишем New SolidColorBrush(Colors.Red) (ну или как там на C#)


    VB.Net - WPF, UWP

    22 октября 2016 г. 8:07
    Отвечающий

Все ответы

  • Здравствуйте,

    Не один в один конечно, но вто схожая тема, смотрите ответ PawelSt:

    How can I bind Foreground to a property in my ViewModel?


    Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение" Мнения, высказанные здесь, являются отражение моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    21 октября 2016 г. 6:55
    Модератор
  • Откровенно говоря не охота вспоминать почему привязка не подхватывает элементы из набора, но решается это очень просто. Вместо Brushes.Red, пишем New SolidColorBrush(Colors.Red) (ну или как там на C#)


    VB.Net - WPF, UWP

    22 октября 2016 г. 8:07
    Отвечающий
  • Спасибо, друзья! :)

    Извините, что сразу не ответил и не отметил как ответ. SolidColorBrush помог.

    25 октября 2016 г. 2:50