【问题标题】:C# MVVM - Change ViewModels passing InfoC# MVVM - 更改 ViewModels 传递信息
【发布时间】:2016-04-29 10:30:51
【问题描述】:

我仍在学习这个 C# MVVM WPF 东西,我在理解一些概念时遇到了一些麻烦,我已经尝试了一些类似的东西,但遗憾的是没有结果。

所以我想>>>如果登录成功打开一个新的 ViewModel 将一个类(你可以在评论中看到,确切的位置)传递给 GeneralViewModel 有人可以在这里帮我一些代码,以便你更好地理解.

提前致谢:)

LoginViewModel

    WifiAP wa;
        #region fields
        private TokenRequest tk;
        public DelegateCommand _loginCommand { get; set; }
public LoginViewModel()
            {
                wa = new WifiAP();
                _loginCommand = new DelegateCommand(
                 (s) => { login(); }, //Execute
                 (s) => { return !string.IsNullOrEmpty(_email); } //CanExecute
                 );

            }
            public DelegateCommand LoginCommand
            {
                get { return _loginCommand; }
            }
    public async void login()
            {
                var sendRequest = new TokenRequest
                {
                    email = Email,
                    mac = getMac(),
                    platform="windowsdesktop"
                };

                //Get Token
                var response = await CommunicationWebServices.PostASM("self/token", "",sendRequest);
                if(response.StatusCode == HttpStatusCode.OK)
                {
                    string responseS = await response.Content.ReadAsStringAsync();
                    var aux =  JsonConvert.DeserializeObject<TokenOK>(responseS); // I have the Token in the Aux
                    var passwordMD5 = hashingMD5(Password);
                    var stringConcat = aux.token + passwordMD5;
                    var finalMD5 = hashingMD5(stringConcat);
                    // Now you can login
                    var sendRequestLogin = new LoginRequest
                    {
                        email = Email,
                        tokenpassword = finalMD5,
                        mac = getMac(),
                        platform = "windowsdesktop"
                    };
                    var responseLogin = await CommunicationWebServices.PostASM("self/login", aux.token, sendRequestLogin);
                    if(responseLogin.StatusCode == HttpStatusCode.OK)
                    {
                        string responseL = await responseLogin.Content.ReadAsStringAsync();                    
                        var auth = JsonConvert.DeserializeObject<LoginAnswer>(responseL);
                        // Change to GeneralViewModel and send the auth variable
                    }else {//...}}

登录视图

    <UserControl.DataContext>
            <ViewModel:LoginViewModel/>
        </UserControl.DataContext>
    <Button x:Name="buttonLogin" Content="Login" 
Command="{Binding LoginCommand}" HorizontalAlignment="Left" Margin="274,305,0,0" VerticalAlignment="Top" Width="248" Style="{DynamicResource FlatButtonStyle}" Height="30" />

【问题讨论】:

  • 嗨@PeterB 你能解释一下吗? LoginCommand 被正确调用,我只想在登录函数中间更改为 generalview 并发送 var auth(来自 web 服务的答案)
  • 好像我误解了这个问题,我以为你想插入一个新的 ViewModel 作为 GeneralViewModel。
  • 不,彼得 B。我已经知道该怎么做了。我只想知道如何通过 ViewModel 发送一个类,而不是仅仅在视图中使用绑定进行更改。

标签: c# wpf web-services mvvm navigation


【解决方案1】:

从之前的answer开始, 您只需稍作改动,即可调用

windowFactory.CreateNewWindow(newViewModel);

这可以很容易地实现为

public class ProductionWindowFactory: IWindowFactory
{

    #region Implementation of INewWindowFactory

    public void CreateNewWindow(AViewModel newWindowViewModel) 
    {
       NewWindow window = new NewWindow()
           {
               DataContext = newWindowViewModel;
           };
       window.Show();
    }

    #endregion
}

所以总之你的代码可能是这样的

 GeneralViewModel generalViewModel = new GeneralViewModel(auth);
 windowFactory.CreateGeneralWindow(generalViewModel);

【讨论】:

  • Giulio8 感谢您的回答,我有一个疑问:在 MainWindowViewModel 中还是在 LoginViewModel 中?
  • 我认为您可以在您编写的 LoginViewModel 中添加最后两行: // 更改为 GeneralViewModel 并发送 auth 变量
  • 出了点问题。不工作:s ...我正在使用视图而不是窗口并使用MVVM架构;不知道这是否会导致一些差异。
  • 一样,没问题。使用现在不起作用的详细信息编辑您的问题...
  • 我无法使用 ViewModel newWindowView 模型。它说这是一个命名空间,它像一个类型一样使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2013-07-29
  • 1970-01-01
相关资源
最近更新 更多