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