Связь между двумя представлениями только в WPF MVVM - PullRequest
0 голосов
/ 25 июля 2011

У меня есть два представления в MVVM (WPF). Первый вид содержит два текстовых поля: Имя пользователя, Пароль, второй вид имеет две кнопки: Отправить и Очистить. Оба вида теперь установлены в форме. Когда я нажимаю кнопку «Очистить», оба текстовых поля очищаются и в «Отправить» отображается сообщение с именем пользователя и паролем. Я использую только MVVM + WPF, а не призму.

ModelView первого вида:

class LoginView:ViewModelBase
    {
        string _userName;
        public string  UserName 
        {
            get {return _userName ; }
            set {
                if (_userName != value)
                {
                    _userName = value;
                }
                base.OnPropertyChanged(UserName);
            }
        }

        string _Pwd;
        public string PWD
        {
            get { return _Pwd; }
            set
            {

                _Pwd = value;
                base.OnPropertyChanged(_Pwd);
            }
        }
    }

и для кнопки

 class ButtonHandler
    {
        private DelegateCommand _ClearData;
        public ICommand ClearCommand
        {
            get
            {
                if (_ClearData == null)
                {
                    _ClearData = new DelegateCommand(ClearText);
                }
                return _ClearData;
            }
        }
        LoginView lg = new LoginView();
        private void ClearText()
        {
            lg.UserName = "";
            lg.PWD = "";
        }
    }

и просмотр кода первого контроля

   <Label Content="Login" Grid.Row="0" Grid.Column="1" VerticalAlignment="Top" HorizontalAlignment="Left"
           FontFamily="Georgia" FontSize="24" FontWeight="UltraBold" ></Label>
    <Label Content="User Name" Grid.Row="1" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Left"></Label>
    <Label Content="Password" Grid.Row="2" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Left"></Label>
    <TextBox  Name="username" Grid.Row="1" Grid.Column="1" Margin="100,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Left" Text="{Binding Path=UserName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" ></TextBox>
    <TextBox  Name="pwd" Grid.Row="2" Grid.Column="1" Margin="100,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Left" Text="{Binding Path=PWD,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox>
    <Separator Grid.Row="0" Grid.Column="1" Height="5" Margin="0,40,0,0" Background="Green"></Separator>

и просмотр кнопок

     <Button x:Name="Submit" Content="Submit" Grid.Column="1"></Button>
     <Button x:Name="Clear" Content="Clear" Grid.Column="2" 
             Command="{Binding Path=ClearCommand, Mode=OneWay, 
             UpdateSourceTrigger=PropertyChanged}" >
     </Button>

Почему это не работает?

Ответы [ 2 ]

2 голосов
/ 25 июля 2011

Вы не используете шаблон MVVM правильно, с этим шаблоном ViewModel не должна иметь ссылку на View. Команда является частью вашей ViewModel, поэтому ваша ссылка на LoginView нарушает шаблон.

Итак, у вас есть два поля ввода и кнопка? для этого у меня будет один ViewModel и один View. ViewModel предоставляет два свойства строки (имя пользователя и пароль) и команду, которая привязывается к кнопке очистки. Когда команда выполняется, она очищает тексты имени пользователя и пароля в ViewModel. Представление будет обновлено соответственно.

1 голос
/ 26 июля 2011

Основной принцип MVVM состоит в том, чтобы иметь класс, к которому может быть привязано представление, в котором есть вся логика приложения.Одной из основных причин является разделение интересов. Поэтому, если вы хотите, чтобы имя пользователя предоставляло свойство, к которому привязано представление, а затем, когда вы хотите войти в систему, вы создаете функцию, которая использует эти ограничения.значения для предоставления вам уровня бизнес-логики вашего приложения.

Казалось бы, это один из способов использовать MVVM в вашем примере:

public class LoginViewModel
{
  public string UserName {get;set;}//Implement INotifyPropertyChanged
  public string PWD {get;set;}

    private DelegateCommand _ClearData;
    public ICommand ClearCommand
    {
        get
        {
            if (_ClearData == null)
            {
                _ClearData = new DelegateCommand(ClearText);
            }
            return _ClearData;
        }
    }

    private void ClearText()
    {
        UserName = "";
        PWD = "";
    }
}

, а затем в xaml:

<TextBox Text={Binding UserName} />
<TextBox Text={Binding PWD} />
<Button Command={Binding ClearCommand}/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...