gpt4 book ai didi

c# - WPF MVVM 文本框绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 10:44:47 24 4
gpt4 key购买 nike

更新

我得到了这个自定义实现 here .使用 prism 的弱引用存在问题。

我是 MVVM 和 Microsoft Prism 的新手。我正试图让我的文本框上的绑定(bind)工作。如果文本框不为空,则登录按钮应该可用。 setter 正在工作,但 CanOnLogin() 始终返回 false。

型号

class UserModel
{
private string userName;
private string passWord;
public string UserName
{
get { return userName; }
set { userName = value; }
}


public string PassWord
{
get { return passWord; }
set { passWord = value; }
}
}

查看型号
class LoginViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private UserModel user;
private DelegateCommand _loginCommand;
public UserModel User
{
get { return user; }
set { user = value; }
}

public string UserName
{
get { return user.UserName; }
set
{
user.UserName = value;
OnPropertyChanged("UserName");
}
}

public ICommand LoginCommand
{
get { return _loginCommand; }
}

public LoginViewModel()
{
_loginCommand = new DelegateCommand(OnLogin, CanOnLogin);
//implement CanOnLoginChanged here?
user = new UserModel();
}

private bool CanOnLogin()
{
if (String.IsNullOrEmpty(user.UserName))
{
return false;
}
else
{
return true;
}
}

private void OnLogin()
{
// Do something here
MessageBox.Show(user.UserName);
}

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

public event EventHandler CanOnLoginChanged
{
add
{
CommandManager.RequerySuggested += value;
}
remove
{
CommandManager.RequerySuggested -= value;
}
}
}

查看
<TextBox Name="username" Text="{Binding Path=UserName, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" HorizontalAlignment="Center" Margin="10" Width="175" Grid.Row="1" Grid.Column="0" Controls:TextBoxHelper.Watermark="Username" Controls:TextBoxHelper.ClearTextButton="True"/>
<Button HorizontalAlignment="Center" Margin="10" Width="87.5" Grid.Row="3" Grid.Column="0" Command="{Binding LoginCommand}">Login</Button>

代码隐藏
public partial class LoginView : MetroWindow
{
public LoginView()
{
InitializeComponent();
DataContext = new LoginViewModel();
}
}

最佳答案

CanOn登录 您应该检查 ViewModel 中的 Property,PropertyChanged 可以工作:

String.IsNullOrEmpty(UserName)

如果这没有帮助,请尝试将您的命令设置为延迟加载,以确保首先正确初始化所有数据。就像是
public ICommand LoginCommand
{
get { return _loginCommand ?? (_loginCommand = new DelegateCommand(OnLogin, CanOnLogin)); }
}

或更改 LoginViewModel() 中的 Initialisation-Order:
user = new UserModel();
_loginCommand = new DelegateCommand(OnLogin, CanOnLogin);

你是对的: 棱镜 委托(delegate)命令并不总是像我期望的那样工作。举报 here .

结帐 Example的自定义实现。

希望这可以帮助!

关于c# - WPF MVVM 文本框绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31627581/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com