Как привязать цвет эллипса к полю объекта?

207
26 апреля 2018, 08:00

Пытаюсь привязать цвет эллипса к полю созданного класса, но ничего не выходит. Что я делаю не так? Xaml:

    <Ellipse Width="5" Height="5" x:Name="Ell" Fill="{Binding elipce}" Grid.Column="0"/>

C#:

    elipce = new SolidColorBrush(System.Windows.Media.Colors.Green);
Answer 1

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

Напомню

  • public string Name; - это поле (Field). Если вы привяжитесь к нему, то будете получать ошибку о том, что "Свойство Name не найдено".
  • public string Name {get; set;} - это свойство (Property), они как раз и используются для работы с привязками (Binding).

По вашей проблеме

У меня создано это свойство с цветом, Который меняется в конструкторе.

  • Если оно создано, к нему успешно все привязалось (нет в логах ошибок), то скорей всего у вас не реализован INotifyPropertyChanged.
  • Если оно создано, но не привязывается, то либо у вас оно не имеет public доступа, либо что то не так с get.

Пример

Покажу простой до безобразия пример того, что вы хотите (буду писать топорно, на практике лучше реализовывать команды и все, что связано с MVVM (view, viewmodel и model).

Разметка XAML

  • Значит, создадим простую разметку, которая будет содержать 3 button и ellipse:

    <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Ellipse Grid.Row="0" Width="30" Height="30" Fill="{Binding Color}" Margin="0,0,0,5"/>
        <StackPanel Grid.Row="1" Orientation="Horizontal">
            <Button Click="BtnClick" Name="RedBtn" Width="60" Height="30" Content="Красный"/>
            <Button Click="BtnClick" Name="BlueBtn" Width="60" Height="30" Content="Синий"/>
            <Button Click="BtnClick" Name="GreenBtn" Width="60" Height="30" Content="Зеленый"/>
        </StackPanel>
    </Grid>
    
  • Как видим тут уже я указал привязку цвета к некому Color, так давайте его создадим, но.. Для начала реализуем INPC (INotifyPropertyChanged):

INotifyPropertyChanged

Что такое INotifyPropertyChanged? По сути это некий инструментарий, который помогает нам взаимодействовать с холстом (то есть окном и его View частью). Другими словами, с помощью данного интерфейса мы оповещаем нашу View об изменениях, которые произошли с нашими свойствами, что в итоге обновляет привязанные контролы (меняет текст, цвет, размер и др.).

Для реализации нам понадобится (есть кстати очень хороший вариант, который расписан в этом ответе:

  • У нашего класса со свойствами смотрим, могут ли они изменится и нужно ли нам обновлять ради них интерфейс, если такие свойства есть, то после названия класса пишем (через двоеточие) : INotifyPropertyChanged.
  • Далее хоть убейте, но до сих пор не знаю кто это предлагает, ReSharper или сама студия, но у меня при наведение на подчеркивающуюся надпись высвечивается помощник, который предлагает реализовать недостающие строчки кода (скорей всего ReSharper), так вот, создается следующий код в нашем классе:

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    
  • Все, наша VM готова для оповещения наших контролов об изменение данных.

Создание свойства

Как мы уже разобрались выше - привязывается WPF любит именно к свойствам, так давайте его создадим:

  • Но, здесь нам надо еще сказать, что "данное свойство изменилось" и для этого создается вот такое "чудо":

    private Brush color;
    public Brush Color
    {
        get => color;
        set
        {
            color = value;
            OnPropertyChanged();
        }
    }
    

Что тут происходит? Смотрите, при получение данных (get) - мы отдаем значение, которое хранится в приватной переменной, а при изменение данных (set) - мы нашей приватной переменной задает измененное значение и вызываем OnPropertyChanged();, который оповестит интерфейс о новом значение. Такое свойство вам надо будет делать везде, где надо оповестить интерфейс об изменение.

Весь код нашей VM:

public class TestViewModel : INotifyPropertyChanged
{
    private Brush color;
    public Brush Color
    {
        get => color;
        set
        {
            color = value;
            OnPropertyChanged();
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Все, тут я думаю уже ваша проблема будет решена.

Допишем приложение...

  • В главном окне укажем нашу VM, как свойство:

    private TestViewModel TestVM { get; set; } = new TestViewModel();
    
  • В конструкторе MainWindow укажем DataContext:

    DataContext = TestVM;
    
  • Ну и на последок, топорно будем менять цвет в нашей VM (лень было делать команду, а надо...):

    private void BtnClick(object sender, RoutedEventArgs e)
    {
        var btn = sender as Button;
        switch (btn?.Name)
        {
            case "RedBtn":
                TestVM.Color = new SolidColorBrush(Colors.Red);
                break;
            case "GreenBtn":
                TestVM.Color = new SolidColorBrush(Colors.Green);
                break;
            case "BlueBtn":
                TestVM.Color = new SolidColorBrush(Colors.Blue);
                break;
        }
    }
    
  • Запускаем и... Результат:

READ ALSO
Алфавитный алгоритм

Алфавитный алгоритм

Требуется из цифры 1 получить A, из 2 получить B, из 3 получить C и тд до ZКак это сделать?

194
Отлов события изменения ObservableCollection

Отлов события изменения ObservableCollection

Есть приложение в котором пользователь может указывать название продукта и его цену, по нажатию на кнопку эти данные вносятся в ObservableCollection...

178
Обход запрета Unity

Обход запрета Unity

Я написал большой скрипт используя SystemNumerics, ошибок в коде не было, Visual Studio его нормально воспринимал

125
Редактирование класса

Редактирование класса

В программе есть классВ нём имеются следующие строки:

223