WPF绑定到类中的类的成员

时间:2014-11-26 07:08:25

标签: c# wpf mvvm

我第一次尝试使用C#,WPF和MVVM。我已经查看了几个答案和教程,但似乎无法做到这一点。

我有一个View a Model和一个ViewModel文件(实际上更多,但试图简化)。在视图中,我想将文本框绑定到视图模型成员。我还想将按钮单击绑定到视图模型方法。

Login(的委托命令工作正常,但我似乎无法更新Acc.ID中的ID属性。 我需要改变什么才能做到这两点?

我知道我可能需要在ViewModel而不是模型中实现PropertyChanged事件......我只是不明白如何。

我可以做的是在后面的代码中将DataContext设置为user.Acc以直接更新模型,但是我显然无法绑定到Login()方法。

ViewModel.cs

public class LoginVM
{
    private ServerInterface _serverInterface;

    private ICommand _loginCommand;

    private EmployeeAccount _acc;

    public ICommand LoginCommand
    {
        get { return _loginCommand; }
    }

    public LoginVM()
    {
        Acc = new EmployeeAccount();

        _serverInterface = new ServerInterface();

        _loginCommand = new DelegateCommand<String>(Login);
    }

    public EmployeeAccount Acc { get; set; }

    private void Login(object state)
    {

        this.Acc.ID = _serverInterface.Encrypt(this.Acc.ID);

    }
}

View.xaml.cs

 public partial class LoginView : Window
{
    public LoginView()
    {
        InitializeComponent();

        BindInXaml();
    }

    private void BindInXaml()
    {
        base.DataContext = new LoginVM();
    }
}

Model.cs

public class EmployeeAccount : INotifyPropertyChanged
{
    String _id;


    public EmployeeAccount()
    {
        ID = "5000";
        Name = "George Washington";
        isAdmin = true;
        Pswd = "TheyDont";
    }

    public String ID
    {
        get { return _id; }
        set
        {
            _id = value;
        this.OnPropertyChanged("ID");
        }
    }

    public string Name { get; set; }

    public Boolean isAdmin { get; set; }

    public string Pswd { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;


    void OnPropertyChanged(string propName)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(
                this, new PropertyChangedEventArgs(propName));
    }

}

.xaml 只提供真正重要的内容

<TextBox x:Name="txtLogInName" Margin="60,43,42,129" TextWrapping="Wrap" Text="{Binding Path=ID, UpdateSourceTrigger=PropertyChanged}" Width="120" Grid.Column="1" Grid.Row="1"/>
        <Button x:Name="btnLogIn" Content="Log on" Command="{Binding LoginCommand}" Margin="160,151,10,23" Grid.Column="1" Grid.Row="1" RenderTransformOrigin="1.667,0.545"/>
        <TextBlock x:Name="txtBlockPassReset" TextAlignment="Center"  Grid.Row="1" Grid.Column="1" RenderTransformOrigin="1.348,1.765" Margin="60,101,42,78">
          <Hyperlink>Reset Password</Hyperlink>
        </TextBlock>
        <PasswordBox x:Name="pswdBoxLoginPass" Grid.Column="1" HorizontalAlignment="Left" Margin="60,72,0,0" Grid.Row="1" VerticalAlignment="Top" Width="120" Password="Password"/>

1 个答案:

答案 0 :(得分:2)

尝试从

更改您的xaml
<TextBox x:Name="txtLogInName" Margin="60,43,42,129" TextWrapping="Wrap" 
    Text="{Binding Path=ID, UpdateSourceTrigger=PropertyChanged}" 
    Width="120" Grid.Column="1" Grid.Row="1"/>

<TextBox x:Name="txtLogInName" Margin="60,43,42,129" TextWrapping="Wrap" 
    Text="{Binding Path=Acc.ID, UpdateSourceTrigger=PropertyChanged}" 
    Width="120" Grid.Column="1" Grid.Row="1" />