Mvvm 视图未在可绑定布局xamarin表单中刷新

Mvvm 视图未在可绑定布局xamarin表单中刷新,mvvm,xamarin.forms,Mvvm,Xamarin.forms,我通过在堆栈视图(如下图所示)中使用可绑定布局创建类别的水平列表,因此当我单击其中一个类别时,我希望更改文本颜色,但在实际绑定中,在触发属性更改后不会更新视图 下面是继承ExtendedBindableObject的ViewModelBase public class ViewModelBase : ExtendedBindableObject { public ViewModelBase(INavigationService navigationService) {

我通过在堆栈视图(如下图所示)中使用可绑定布局创建类别的水平列表,因此当我单击其中一个类别时,我希望更改文本颜色,但在实际绑定中,在触发属性更改后不会更新视图

下面是继承ExtendedBindableObject的ViewModelBase

 public class ViewModelBase : ExtendedBindableObject
  {

    public ViewModelBase(INavigationService navigationService)
    {

    }

    private bool _isBusy;

    public event PropertyChangedEventHandler PropertyChanged;

    public bool IsBusy
    {
        get => _isBusy;
        set
        {
            _isBusy = value;
            RaisePropertyChanged(() =>(IsBusy));
        }
    }

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public virtual Task InitializeAsync(object data)
    {
        return Task.FromResult(false);
    }
}
 public abstract class ExtendedBindableObject : BindableObject
{
    public void RaisePropertyChanged<T>(Expression<Func<T>> property)
    {
        var name = GetMemberInfo(property).Name;
        OnPropertyChanged(name);
    }



    private MemberInfo GetMemberInfo(Expression expression)
    {
        MemberExpression operand;
        LambdaExpression lambdaExpression = (LambdaExpression)expression;
        if (lambdaExpression.Body as UnaryExpression != null)
        {
            UnaryExpression body = (UnaryExpression)lambdaExpression.Body;
            operand = (MemberExpression)body.Operand;
        }
        else
        {
            operand = (MemberExpression)lambdaExpression.Body;
        }
        return operand.Member;
    }
}
下面是继承BindableObject的ExtendedBindableObject

 public class ViewModelBase : ExtendedBindableObject
  {

    public ViewModelBase(INavigationService navigationService)
    {

    }

    private bool _isBusy;

    public event PropertyChangedEventHandler PropertyChanged;

    public bool IsBusy
    {
        get => _isBusy;
        set
        {
            _isBusy = value;
            RaisePropertyChanged(() =>(IsBusy));
        }
    }

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public virtual Task InitializeAsync(object data)
    {
        return Task.FromResult(false);
    }
}
 public abstract class ExtendedBindableObject : BindableObject
{
    public void RaisePropertyChanged<T>(Expression<Func<T>> property)
    {
        var name = GetMemberInfo(property).Name;
        OnPropertyChanged(name);
    }



    private MemberInfo GetMemberInfo(Expression expression)
    {
        MemberExpression operand;
        LambdaExpression lambdaExpression = (LambdaExpression)expression;
        if (lambdaExpression.Body as UnaryExpression != null)
        {
            UnaryExpression body = (UnaryExpression)lambdaExpression.Body;
            operand = (MemberExpression)body.Operand;
        }
        else
        {
            operand = (MemberExpression)lambdaExpression.Body;
        }
        return operand.Member;
    }
}
公共抽象类ExtendedBindableObject:BindableObject
{
public void raiseProperty已更改(表达式属性)
{
var name=GetMemberInfo(属性).name;
OnPropertyChanged(名称);
}
私有成员信息GetMemberInfo(表达式)
{
成员表达式操作数;
LambdaExpression LambdaExpression=(LambdaExpression)表达式;
if(lambdaExpression.Body作为UnaryExpression!=null)
{
UnaryExpression body=(UnaryExpression)lambdaExpression.body;
操作数=(MemberExpression)body.operand;
}
其他的
{
操作数=(MemberExpression)lambdaExpression.Body;
}
返回操作数.Member;
}
}
你能给我举个例子,说明如何提高房地产价格吗 二传手

尝试将您的
SpicesCategory
模型更改为:

public class SpicesCategory :ExtendedBindableObject
{
    public long Id { get; set; }

    public bool IsSelected { get; set; }

    private string _name { get; set; }

    public string Name
    {
        get => _name;
        set
        {
            _name = value;
            RaisePropertyChanged(() => (Name));
        }
    }

    private Color _nameColor { get; set; }

    public Color NameColor
    {
        get => _nameColor;
        set
        {
            _nameColor = value;
            RaisePropertyChanged(() => (NameColor));
        }
    }
}

在类上实现INotifyPropertyChangedSpicesCategory@MaxHampton您好,我实际使用的是RaisePropertyChanged,请检查上面的代码是否已更新。我看到您在ViewModel类上实现了INotifyPropertyChanged,但您没有将文本颜色绑定到ViewModel上的属性,而是绑定到SpicesCategory上的属性。在这种情况下,您需要来自持有要绑定到的属性的类的属性更改通知。更改应该从您正在设置item.Name和item.NameColorok的foreach循环触发。我在foreach循环ObservableCollection NewCategory=new ObservableCollection()之后尝试了此操作;NewCategory=类别列表;CategoryListItems=新的ObservableCollection();CategoryListItems=新类别;但它不起作用,问题是我的UI部分没有得到更新,我的模型得到了更新的值所有你需要的是
SpicesAgegory:BindableObject
和RaiseProperty在setters中更改感谢它现在的工作,只是想知道为什么它没有从我的ViewModel中更改,因为它是继承的>ViewModelBase,ViewModelBase是继承的>ExtendedBindableObject,所以它应该从我的ViewModel中更新,而且我的代码对listview非常有效,它只是在某些情况下不起作用。当您设置绑定时,在告诉视图时,请注意事件PropertyChanged对包含绑定到的属性的对象触发。页面具有视图模型的绑定上下文,但列表视图的每个单元格(例如)都具有集合中绑定到列表视图项源的对象的绑定上下文。然后,单元内的绑定将监视要在这些对象(而不是视图模型类)上触发的PropertyChanged
public class SpicesCategory :ExtendedBindableObject
{
    public long Id { get; set; }

    public bool IsSelected { get; set; }

    private string _name { get; set; }

    public string Name
    {
        get => _name;
        set
        {
            _name = value;
            RaisePropertyChanged(() => (Name));
        }
    }

    private Color _nameColor { get; set; }

    public Color NameColor
    {
        get => _nameColor;
        set
        {
            _nameColor = value;
            RaisePropertyChanged(() => (NameColor));
        }
    }
}