WPF使用一个VIEwModel在两个单独的窗口中操作TextBox

vngu2lb8  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(101)

我在绑定数据时遇到问题。我想绑定文本的文本框这是在主窗口的另一个文本框这是在儿童窗口。在主窗口中,用户可以在文本框中输入字符串。ChildWindow将只显示一些数据。我已经成功地从MainWIndow绑定了TextBox,我可以看到在调试时它会命中MainWindowViewModel,但是对ChildWindow没有影响。
我的App.xaml.cs看起来像这样:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        var window = new MainWindow() { DataContext = new MainWindowViewModel() };
        window.Show();

        base.OnStartup(e);
    }
}

字符串
然后MainWIndow创建一个ChildWindow的示例,它们都使用相同的ViewModel,如下所示:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        var viewModel = new MainWindowViewModel();
        ChildWindow childWindow = new ChildWindow();
        childWindow.DataContext = viewModel;
        childWindow.Show();
        InitializeComponent();
        DataContext = viewModel;
    }
}


主窗口视图模型:

public class MainWindowViewModel : ViewModelBase
{
    public string _firstTeamName { get; set; }
    public string FirstTeamName
    {
        get { return _firstTeamName; }
        set
        {
            _firstTeamName = value;
            OnPropertyChanged(nameof(FirstTeamName));
        }
    }
}


视图模型库:

public abstract class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        var handler = this.PropertyChanged;
        if (handler != null)
        {
            handler(this, e);
        }
    }
}


在MainWindow.xaml中绑定:

<TextBox x:Name ="firstTeam"  Height="30" VerticalAlignment="Top" Text ="{Binding FirstTeamName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>


在ChildWindow.xaml中绑定:

<TextBlock Text ="{Binding FirstTeamName}" FontSize="24"></TextBlock>

ajsxfq5m

ajsxfq5m1#

错误是设置MainWindow.DataContext两次。

  1. MainWindow的内部结构
    1.在App.OnStartUpvar window = new MainWindow() { DataContext = new MainWindowViewModel() };
    这里发生了什么
  • new MainWindow()将调用构造函数,并将MainWindowChildWindowDataContext设置为MainWindowViewModel的同一个示例。
  • { DataContext = new MainWindowViewModel() }将用MainWindowViewModel的新示例覆盖MainWindowDataContext

现在,这两个窗口具有ViewModel的两个不同示例,并且不会按预期工作。
这个应该能修好

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        var window = new MainWindow() 
        { 
            // DataContext = new MainWindowViewModel() 
        };
        window.Show();

        base.OnStartup(e);
    }
}

字符串

相关问题