首先,我对MVVM的概念非常陌生。我甚至不确定我在这里问的是一个MVVM问题。所以请原谅我在这里犯的错误。
我正在Bind
Foreground
TextBlock
UserControl
内的TextColor
属性中MyViewModel.cs
TextColor
属性<Window x:Class="WpfApplication23.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
xmlns:local="clr-namespace:WpfApplication23">
<StackPanel>
<local:UserControl1 x:Name="MyControl"/>
<Button Content="Change Color"
Width="200"
Height="30"
Click="ButtonBase_OnClick"/>
</StackPanel>
</Window>
。我还希望能够通过代码更改using System.Windows;
namespace WpfApplication23
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new MyViewModel();
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
// Change the `TextColor` property in `MyViewModel.cs`
}
}
}
属性。例如,单击按钮。我怎样才能实现所有这些目标。
这是我到目前为止提出的完整的非工作无错误代码!
主窗口:
<UserControl x:Class="WpfApplication23.UserControl1"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Grid>
<TextBlock Text="Sample Text" Foreground="{Binding TextColor}"/>
</Grid>
</UserControl>
MainWindow.xaml.cs:
public class MyViewModel
{
public Brush TextColor;
public MyViewModel()
{
TextColor = Brushes.Red;
}
}
用户控件:
{{1}}
MyViewModel.cs:
{{1}}
答案 0 :(得分:3)
您的MyViewModel
类应该声明公共TextColor
属性,而不是公共字段(并且您可以将其重命名为TextBrush
,因为它是Brush,而不是Color)。为了能够通知属性值的更改,它还应该实现INotifyPropertyChanged接口。
public class MyViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private Brush textColor = Brushes.Red;
public Brush TextColor
{
get { return textColor; }
set
{
textColor = value;
RaisePropertyChanged("TextColor");
}
}
private void RaisePropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
在按钮点击处理程序中,您现在可以将DataContext
强制转换为MyViewModel类,并设置属性。
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
var vm = (MyViewModel)DataContext;
vm.TextColor = Brushes.Blue;
}
更改颜色的更好解决方案是将Button的Command
属性绑定到视图模型中的ICommand
。您可以在MSDN上的Commanding Overview文章中开始阅读此内容。