Переход от Textbox к VM> Сервисы - PullRequest
0 голосов
/ 30 января 2020

MainWindow.xaml:

<TextBox HorizontalAlignment="Left" Height="23" Margin="308,90,0,0" TextWrapping="Wrap" Text = "{Binding Login, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="120"/>

MainWindow.cs:

public partial class MainWindow : Window
{
    UserViewModel userViewModel = new UserViewModel();
    UserService userService = new UserService();


    public MainWindow()
    {
        InitializeComponent();
        DataContext = userViewModel;
    }


    private void Button_Click(object sender, RoutedEventArgs e)
    {
        userService.CheckUserExist();

    }

Модель:

public string Login { get; set; }

ViewModel:

publi c class UserViewModel: INotifyPropertyChanged {приватная строка _login;

public string Login
{
    get { return _login; }
    set
    {
        _login = value;
        OnPropertyChange("Login");
    }
}

public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChange(string propertyName)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

}

Служба:

public string Login { get; set; }

        public void CheckUserExist()
        {
            using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain))
            {
                var user = UserPrincipal.FindByIdentity(principalContext, Login);
                if (user == null)
                { UserMessageText = "xx"; }
                {
                }
            }
        }

Почему логин в методе CheckUserExist () всегда пуст, когда я его запускаю? Я пытался с UpdateSourceTrigger = LostFocus и RaisePropertyChanged (); Данные метода правильно отправляются в VM i View.

1 Ответ

3 голосов
/ 30 января 2020

Значение всегда null, потому что вы никогда не устанавливаете его. Кроме того, следуя шаблону MVVM , вашему представлению не разрешается иметь зависимость от модели или указывать UserService c.
Ответственность за передачу модели лежит на модели представления. значение от UserViewModel.Login до UserService.Login:

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    private UserViewModel userViewModel = new UserViewModel();


    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this.userViewModel;
    }
}

MainWindow.xaml

<StackPanel>
  <TextBox Text="{Binding Login}"/>
  <Button Content="Submit" Command="{Binding SubmitLoginDataCommand}"/>
</StackPanel>

UserViewModel.cs

public class UserViewModel
{
  public void SubmitLoginData(object loginData)
  {
    this.userService.CheckUserExist(this.Login);
  }

  public ICommand SubmitLoginDataCommand => new RelayCommand(SubmitLoginData, param => true);
  public string Login { get; set; }  
  private UserService userService { get; set; }
}

UserService.cs

public void CheckUserExist(string login)
{
  using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain))
  {
    var user = UserPrincipal.FindByIdentity(principalContext, login);
    if (user == null)
    { 
      this.UserMessageText = "xx"; 
    }
  }
}

RelayCommand.cs
Реализация взята из Документы Microsoft: передача командного логи c

public class RelayCommand : ICommand
{
  #region Fields 
  readonly Action<object> _execute;
  readonly Predicate<object> _canExecute;
  #endregion // Fields 
  #region Constructors 
  public RelayCommand(Action<object> execute) : this(execute, null) { }
  public RelayCommand(Action<object> execute, Predicate<object> canExecute)
  {
    if (execute == null)
    {
      throw new ArgumentNullException("execute");
    }

    this._execute = execute; this._canExecute = canExecute;
  }
  #endregion // Constructors 
  #region ICommand Members 
  [DebuggerStepThrough]
  public bool CanExecute(object parameter)
  {
    return this._canExecute == null ? true : this._canExecute(parameter);
  }
  public event EventHandler CanExecuteChanged
  {
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
  }
  public void Execute(object parameter) { this._execute(parameter); }
  #endregion // ICommand Members 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...