Reputation: 377
I have made a program with several pages. It is a simple program, where I have at top area also labels at which page you currently are. For every page it is a new label defined. All labels are defined in dockpanel.xaml which is later included to mainwindow.xaml.
I like to made current page label in different color.
MY CODE:
My DockPanel.xaml for first label (others are the same only number change)
<Label Name="Label1" Foreground="{Binding Path=Label1.Color}" Content="welcome" Grid.Column="0" HorizontalAlignment="Left" FontSize="20" FontWeight="Light" FontStyle="Italic"/>
My DockPanelViewModel
public class DockPanelViewModel : ViewModelBase
{
#region Member fields
#endregion
#region Constructors
/// <summary>
/// The default constructor
/// </summary>
public DockPanelViewModel()
{
}
#endregion
#region Properties
protected Brush _color;
public Brush Color
{
get { return _color; }
set
{
_color = value;
NotifyPropertyChanged("Color");
}
}
#endregion
}
Later definitions of ViewModel one of the page:
Label1.Color = System.Windows.Media.Brushes.Yellow;
The point is that my code dont want to change color and I dont know what is wrong :)
Please for help. Thanks!
Added .. PageViewModelBase
public virtual DockPanelViewModel Label1
{
get
{
if (_Label1 == null)
{
_Label1 = new DockPanelViewModel()
{
//Text = "Back",
Color = System.Windows.Media.Brushes.Yellow,
};
}
return _Label1;
}
set
{
_Label1 = value;
NotifyPropertyChanged("Label1");
}
}
Upvotes: 4
Views: 21262
Reputation: 2231
It's getting even worse now with the updated question. Please optimize and fix your namings!
To bring this to work, here's my suggestion:
Here's a working example: View:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Foreground="{Binding Path=LabelColor}" Content="welcome" FontSize="20" FontWeight="Light" FontStyle="Italic"/>
<StackPanel Grid.Column="1">
<Button Content="Red" Width="75" Command="{Binding ChangeColorCommand}" CommandParameter="#FF0000"/>
<Button Content="Green" Width="75" Command="{Binding ChangeColorCommand}" CommandParameter="#00FF00" />
</StackPanel>
</Grid>
View-Code:
public MainWindow()
{
InitializeComponent();
var vm = new ViewModel();
DataContext = vm;
}
ViewModel:
public class ViewModel : INotifyPropertyChanged
{
public ICommand ChangeColorCommand { get; set; }
protected Brush _color;
public Brush LabelColor
{
get { return _color; }
set
{
_color = value;
OnPropertyChange();
}
}
public ViewModel()
{
LabelColor = Brushes.Yellow;
ChangeColorCommand = new RelayCommand((o) =>
{
LabelColor = new BrushConverter().ConvertFromString(o.ToString()) as SolidColorBrush;
});
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChange([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
RelayCommand is the well-known standard class found everywhere on the web.
Upvotes: 2
Reputation: 1749
I have taken buttons
instead of lable
and done with my code like this
//Method
private void changeBackgroundOfButtons(string selectedButtons)
{
switch (selectedButtons)
{
case "home":
HomeButton.Background = (SolidColorBrush)new BrushConverter().ConvertFromString("#0199ED"); //HomeButton is my button
TextBlock1.Foreground = Brushes.White; //Also I changed the text of that button
case:
//For all my buttons
}
}
On My Buttons
click event I called this Method.
private void HomeButton_OnClick(object sender, RoutedEventArgs e)
{
changeBackgroundOfButtons("home");
//Your code after this.
}
Upvotes: -1