Пытаюсь привязать цвет эллипса к полю созданного класса, но ничего не выходит. Что я делаю не так? Xaml:
<Ellipse Width="5" Height="5" x:Name="Ell" Fill="{Binding elipce}" Grid.Column="0"/>
C#:
elipce = new SolidColorBrush(System.Windows.Media.Colors.Green);
Так, что бы не тянуть у вас сотню раз миллион строк кода, напишу простенький ответ...
В комментариях мы уже разобрались надеюсь с вами со свойствами и полями.
public string Name;
- это поле (Field). Если вы привяжитесь к нему, то будете получать ошибку о том, что "Свойство Name не найдено". public string Name {get; set;}
- это свойство (Property), они как раз и используются для работы с привязками (Binding).У меня создано это свойство с цветом, Который меняется в конструкторе.
public
доступа, либо что то не так с get.Покажу простой до безобразия пример того, что вы хотите (буду писать топорно, на практике лучше реализовывать команды и все, что связано с MVVM (view, viewmodel и model).
Значит, создадим простую разметку, которая будет содержать 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? По сути это некий инструментарий, который помогает нам взаимодействовать с холстом (то есть окном и его 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;
}
}
Запускаем и... Результат:
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Требуется из цифры 1 получить A, из 2 получить B, из 3 получить C и тд до ZКак это сделать?
Есть приложение в котором пользователь может указывать название продукта и его цену, по нажатию на кнопку эти данные вносятся в ObservableCollection...
Я написал большой скрипт используя SystemNumerics, ошибок в коде не было, Visual Studio его нормально воспринимал