我创建了一个程序,当您在第二个窗口中键入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;
}
}
答案 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
,否则将无法看到用户更改。