将UserControl中元素的属性绑定到MyViewModel.cs中的属性

时间:2014-07-29 19:35:56

标签: c# wpf xaml mvvm

首先,我对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}}

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文章中开始阅读此内容。