C# OnPropertyChanged()在MVVM中不工作
我用同样的问题把所有其他的问题都找遍了。但我无法从他们那里找到任何解决办法 OnPropertyChanged正在触发,但控件未更新。我正在使用Mahapps.Metro进程控制 查看代码C# OnPropertyChanged()在MVVM中不工作,c#,wpf,mvvm,mahapps.metro,C#,Wpf,Mvvm,Mahapps.metro,我用同样的问题把所有其他的问题都找遍了。但我无法从他们那里找到任何解决办法 OnPropertyChanged正在触发,但控件未更新。我正在使用Mahapps.Metro进程控制 查看代码 <controls:MetroWindow.Resources> <userObj:LoginViewLogic x:Key="UserData"/> <userObj:LoginViewLogic x:Key="LoginViewLogic"/&
<controls:MetroWindow.Resources>
<userObj:LoginViewLogic x:Key="UserData"/>
<userObj:LoginViewLogic x:Key="LoginViewLogic"/>
</controls:MetroWindow.Resources>
<Grid>
<Canvas>
<controls:ProgressRing Name="ProgressRing" Canvas.Left="133" Canvas.Top="154" Height="50" Width="35" IsActive="{Binding Source={StaticResource UserData},Path=UserData.IsProgressRingActive}"/>
</Canvas>
</Grid>
public class LoginViewLogic {
public LoginViewLogic() {
_userData = new User(AppSettings.ReadCredentials(),(bool)loadedSettings);
}
private User _userData;
public User UserData
{
get { return _userData; }
set { _userData = value; }
}
public async void Login() {
_userData.IsProgressRingActive = true;
var loginResult = await Stuff.Login(_userData);
if (!loginResult) {
MessageBox.Show("You have entered an invalid username or password",
"Information", MessageBoxButton.OK, MessageBoxImage.Error);
_userData.IsProgressRingActive = false;
}
}
型号代码
public class User : INotifyPropertyChanged {
private bool _isProgressRingActive;
public bool IsProgressRingActive {
get { return _isProgressRingActive; }
set {
_isProgressRingActive = value;
OnPropertyChanged("IsProgressRingActive");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
您的viewmodel还应引发PropertyChanged事件。 试试下面的代码
public class LoginViewLogic : INotifyPropertyChanged
{
public LoginViewLogic()
{
_userData = new User(AppSettings.ReadCredentials(),(bool)loadedSettings);
}
private User _userData;
public User UserData
{
get { return _userData; }
set { _userData = value; }
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
你试过这个吗:
<controls:MetroWindow.Resources>
<userObj:LoginViewLogic x:Key="LoginViewLogic"/>
</controls:MetroWindow.Resources>
<Grid>
<Canvas>
<controls:ProgressRing Name="ProgressRing" Canvas.Left="133" Canvas.Top="154" Height="50" Width="35" IsActive="{Binding Source={StaticResource LoginViewLogic},Path=UserData.IsProgressRingActive}"/>
</Canvas>
</Grid>
因此,您只创建并绑定到LoginViewLogic类的一个实例?您的输出窗口是否显示任何绑定错误?是否确实在正确的
LoginViewLogic
实例上调用了Login
方法?您有两个,当您绑定到UserData
资源时,是否调用LoginViewLogic
资源上的方法?至少,视图模型中缺少的INotifyPropertyChanged
实现不是您的问题(尽管实现它不会有什么坏处)。没有绑定错误。其他所有内容都是以相同的方式绑定并工作的。我在视图模型中实现了NotChanged。等待资料。登录是的,您正在阻止UI线程。不,我没有阻止UI,我发现问题出在xaml绑定代码上仍然是相同的问题。