将控件映射到viewmodel

时间:2012-05-09 12:38:12

标签: .net wpf mvvm

我知道这可能是一个新手问题,但同样,我对WPF还不熟悉。现在,我的大多数文本框,标签,文本块等都是基于逻辑的内容隐藏在xaml.cs代码背后。我想知道是否有办法将我的控件从我的xaml文件映射到viewmodel?

<TextBlock Name="txtBlockName" Text="Name:" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="15,0,0,0" Visibility="Hidden" />
<TextBox Name="txtName"  Width="auto" HorizontalAlignment="Left" VerticalAlignment="Bottom" Visibility="Hidden" />

2 个答案:

答案 0 :(得分:2)

确保将viewmodel设置为控件的DataContext。然后你可以使用像

这样的东西
<TextBox Text="{Binding PropertyName, Mode=TwoWay}" Name="txtName"  Width="auto" HorizontalAlignment="Left" VerticalAlignment="Bottom" />

将TextBox的Text绑定到viewmodel的PropertyName

答案 1 :(得分:1)

使用绑定(你有单向和双向绑定,在这种情况下你可能正在寻找双向绑定)。

另请查看此处:the msdn tutorial,您可以保留xaml binding cheat sheet:)。

一些基本的例子。我所做的是设置datacontext,在这种情况下我将它设置为MainWindow类(本身),但是您可以轻松地将其设置为您的viewmodel。然后我将MyFoo.MyString的值绑定到文本框的text属性。

按钮和其他文本字段用于说明双向绑定有效(在这种情况下,它甚至是默认值)。

XAML:

<Window x:Class="WpfApplication1.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"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
        <TextBox Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" Text="{Binding MyFoo.MyString}" />
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="12,41,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="12,70,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" IsEnabled="False" Text="Init" />
    </Grid>
</Window>

使用以下定义创建一个类Foo

public class Foo
{
    public string MyString { get; set; }
}

在你的MainWindow代码中,你有这个:

public partial class MainWindow : Window
{
    public Foo MyFoo { get; set; }

    public MainWindow()
    {
        MyFoo = new Foo() { MyString = "Hello" };

        InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        textBox2.Text = MyFoo.MyString;
    }
}

这只是一个快速而肮脏的例子。我想你可以把剩下的事情搞清楚,否则:只是环顾四周,有关WPF中数据绑定的很多信息。