如何在两个不同窗口中的TextBox和Label之间绑定数据?

时间:2016-11-03 14:29:35

标签: c# wpf xaml

我创建了一个程序,当您在第二个窗口中键入TextBox时,该程序会在第一个窗口中更改Label中的文本。我的想法是,我想从我的第一个窗口打开一个新窗口,然后在这个新窗口上我想输入一个名称,然后按一个按钮使该名称显示在第一个窗口中。我让自己明白了吗?谁能帮我吗?提前谢谢!

第一个窗口(MainWindow) -

select *From mask
where @Maskcode
like '%'+replace(MaskCode,'*',''+'%'

MainWindow的Xaml -

    public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();
    }

    private void button_Click(object sender, RoutedEventArgs e)
    {
        var createPlayerWindow = new CreatePlayerWindow();
        DataContext = this;
        createPlayerWindow.Show();
    }
}

第二个窗口(CreatePlayerWindow) -

    <Grid>
    <Label x:Name="label2" Content="Name:" HorizontalAlignment="Left" Margin="10,63,0,0" VerticalAlignment="Top"/>
    <Label x:Name="lblName" Content="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Margin="90,63,0,0" VerticalAlignment="Top"/>
    <Button x:Name="button" Content="Create Player" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="81" Click="button_Click"/>

</Grid>

CreatePlayerWindow的Xaml -

    public partial class CreatePlayerWindow : Window
{
    public CreatePlayerWindow()
    {
        InitializeComponent();
    }

    private void button_Click(object sender, RoutedEventArgs e)
    {
        string playerName = txbName.Text;

        Player player = new Player(playerName);
        this.DataContext = player;
    }
}

模特(玩家) -

    <Grid>
    <Label x:Name="label" Content="Name :" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>
    <TextBox x:Name="txbName" HorizontalAlignment="Left" Height="23" Margin="63,12,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
    <Button x:Name="button" Content="Create Player" HorizontalAlignment="Left" Margin="101,129,0,0" VerticalAlignment="Top" Width="88" Click="button_Click"/>
    <Label x:Name="label1" Content="Class :" HorizontalAlignment="Left" Margin="10,41,0,0" VerticalAlignment="Top"/>
    <ComboBox x:Name="cmbClass" HorizontalAlignment="Left" Margin="63,45,0,0" VerticalAlignment="Top" Width="120"/>

</Grid>

ViewModel(ViewModelBase) -

    public class Player : ViewModelBase
{
    private string _name;

    public string Name
    {
        get
        {
            return this._name;
        }
        set
        {
            this._name = value;
            OnPropertyChanged();
        }
    }

    public Player(string name)
    {
        _name = name;
    }
}

2 个答案:

答案 0 :(得分:1)

您的MainWindow需要一个ViewModel来进行数据绑定。 DataContext =这在这里没用。因此,创建一个具有PlayerName属性的新类(带有支持字段),在MainWindow构造函数中对其进行实例化,并将主窗口数据绑定设置为它。在将支持字段设置为值后,在setter中调用OnPropertyChanged。将您的标签绑定到PlayerName属性。

在点击事件中,您应该创建createplayerwindow的viewmodel(player-)实例,并将其绑定到createplayerwindow-instance的datacontext。在createplayerwindow中添加缺少的数据绑定以更新viewmodel(twoway)。使用ShowDialog()替换按钮单击事件中的Show()方法调用。在ShowDialog调用之后,使用viewmodel.name值调用新的属性setter。

答案 1 :(得分:1)

让主页面的数据上下文和窗口的数据上下文使用相同的实例化 VM,它们将使用Name属性。

然后在xamls中适当地绑定到VM上的Name属性,该属性将遵循INotifyPropertyChange通知,以便在更改时它将更新另一个项目。

不要忘记,在编辑XAML时,绑定Mode应为TwoWay,否则将无法看到用户更改。