C# OnPropertyChanged()在MVVM中不工作

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"/&

我用同样的问题把所有其他的问题都找遍了。但我无法从他们那里找到任何解决办法

OnPropertyChanged正在触发,但控件未更新。我正在使用Mahapps.Metro进程控制

查看代码

<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绑定代码上仍然是相同的问题。