wpf 从UserControl返回到父级C#

ca1c2owp  于 2023-10-22  发布在  C#
关注(0)|答案(1)|浏览(191)

我想构建一个基于contentcontrol的应用程序。我的目标是拥有一个包含contentcontrol元素的主窗口和几个通过contentcontrol呈现的usercontrol元素。我的问题是:我需要一种方法来显示用户控件并在其中执行操作。在动作执行之后,用户控件应该返回一个值(或类似的值)到包含contentcontrol元素的父窗口,这样我就可以更新contentcontrol的内容。我希望你能理解这个可怕的解释。
下面是一个例子:我有一个包含contentcontrol元素的主窗口。在初始化这个主窗口时,我将contentcontrol的Content属性设置为一个名为“loginview”的新UserControl元素,以便在主窗口中显示loginview。从那里我在loginview中执行操作,如输入用户名和密码。一切都完成后,我点击按钮“登录”,并检查输入的值是否正确与否。当检查成功时,我想告诉主窗口“我完成了”,并设置一个新的内容。因此,当执行操作时,我希望回到主窗口的代码中。
有谁能告诉我怎么才能做到“回归父母”吗?
我试图用Window parentWindow = Window.GetWindow(this.Parent);获取父元素,但这并不是我真正想要的。
我想要的东西一样,如果用户控件是一个新的窗口,它得到了LoginView window = new LoginView(); window.Show();调用
在窗口被调用后,我从主窗口返回到代码。

j2qf4p5b

j2qf4p5b1#

WPF偏向于MVVM模式。这样你就可以把你的UI分成视图(即,xaml文件)和ViewModels(即cs文件),并使用绑定将视图连接到视图模型。
要使用多个视图,您可以让主视图包含每个子视图,您可以执行以下操作:
MainViewModel.cs:

public class MainViewModel : INotifyPropertyChanged
{
    public Login{get;}
    public MySubViewModel {get;}
    public MainViewModel(){
       Login = new LoginViewModel();
       MySubViewModel = new SubViewModel();
    }
    // Implementation of INotifyPropertyChanged
}

MainView.xaml:

<StackPanel>
    <LoginView DataContext={Binding Login}/>
    <SubView DataContext={Binding MySubViewModel2 }/>
</StackPanel>

您可以在LoginViewModel上拥有IsLoggedInProperty

public class LoginViewModel : INotifyPropertyChanged
    private bool isUserLoggedIn;
    public LoginViewModel(){
    }
    
    public bool IsUserLoggedIn{
        get => isUserLoggedIn;
        set {
           isUserLoggedIn = value;
           PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsUserLoggedIn)));
        }
     }
    // Implementation of INotifyPropertyChanged

这允许您的MainView绑定到此属性,如<Button IsEnabled={Binding Login.IsUserLoggedIn>
请注意,MVVM模式使得处理按钮有点麻烦,因为按钮需要绑定到ICommand。一个可能的解决方案是创建一个DelegateCommand,让按钮调用一个方法,而不需要为每个按钮创建一个类。

相关问题