MVVM C#​​ 在视图之间传递数据(窗口)

shi*_*hiv 5 c# wpf mvvm

1)在多个视图之间传递数据的最佳方法是什么?

2)我有场景(MVVM C#​​):

MainWindow 中的 TextBox 和 Button 以及 Window1 中的 TextBlock,在单击按钮时(我正在使用 Icommand),MainWindow 的 TextBox 中的数据必须出现在 Window1 的 TextBlock 中?

视图模型库

public class ViewModelBase
{
    public Commandclass commandclass { get; set; }

    public ViewModelBase()
    {
        commandclass = new Commandclass(this);
    }

    private string fname;        
    public string vmname
    {
        get { return fname; }
        set { fname = value; }
    }        

    public void OnCommand()
    {         
        Window1 w = new Window1();
        /* How to bind ???*/
        w.Show();
    }
}
Run Code Online (Sandbox Code Playgroud)

命令类.cs

public class Commandclass : ICommand
    {
        public ViewModelBase vmclass { get; set; }
        public Commandclass(ViewModelBase vmb)
        {
            vmclass = vmb;
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }
        public event EventHandler CanExecuteChanged;

        public void Execute(object parameter)
        {
            vmclass.OnCommand();
        }
    }
Run Code Online (Sandbox Code Playgroud)

观看次数

**MainWindow.xaml**

<Window x:Class="Multiwindow.MainWindow"
        …
        xmlns:vm="clr-namespace:Multiwindow.Viewmodel">
    <Window.Resources>        
        <vm:ViewModelBase x:Key="vmodel"/>
    </Window.Resources>

    <Grid Background="Gray" DataContext="{StaticResource vmodel}">

        <TextBox Height="26" Margin="194,115,154,179" Width="169" 
                  Text="{Binding vmname, Mode=TwoWay}"/>
        <Button Content="Button1" HorizontalAlignment="Left" 
                Margin="251,158,0,0" VerticalAlignment="Top"
                Command="{Binding commandclass, Source={StaticResource vmodel}}"/>

    </Grid>
</Window>

**Window1.xaml**

<Window.Resources>
        <vm:ViewModelBase x:Key="vmodel"/>
</Window.Resources>
<Grid >
    <TextBlock FontSize="20" Height="28" Width="169" Foreground="Black"
                    Background="Bisque" />
</Grid>
Run Code Online (Sandbox Code Playgroud)

我用谷歌搜索并找到了一个项目,但它很复杂,请建议我的 2) 问题的答案会有所帮助..谢谢。

Pik*_*koh 5

这就是我将如何做到这一点。在调用按钮单击的命令中,我会这样做:

Window2 w= new Window2();
w.DataContext=new Window2ViewModel();
((Window2ViewModel)w.DataContext).TextForTextblock=TextFromTextbox;
w.Show();
Run Code Online (Sandbox Code Playgroud)

编辑

看到您的代码,您可以这样做,因为我认为两个窗口都共享 ViewModelBase:

Window1 w= new Window1();
w.DataContext=this;
w.Show();
Run Code Online (Sandbox Code Playgroud)

您还必须绑定您的 TextBlock:

<TextBlock FontSize="20" Height="28" Width="169" Foreground="Black"
                Background="Bisque" Text="{Binding vmname}"/>
Run Code Online (Sandbox Code Playgroud)