C# 从ViewModel WPF更新XAML中的组合框ObservableCollection绑定
我在WPF工作,有一个视图模型C# 从ViewModel WPF更新XAML中的组合框ObservableCollection绑定,c#,wpf,xaml,silverlight,telerik,C#,Wpf,Xaml,Silverlight,Telerik,我在WPF工作,有一个视图模型ModifiedReasonViewModel,它是我的XAML视图的DataContext。组合框不显示调试时在数据上下文中可以看到的4项中的任何一项。我认为这肯定与我异步拉原因标签的事实有关。有没有办法解决这个问题 当我仅使用构造函数中初始化的测试字符串列表测试此代码时,它会按预期工作 这是我目前在XAML中使用的RadComboBox: d:DataContext="{d:DesignInstance Type=vm:ATMModifiedReaso
ModifiedReasonViewModel
,它是我的XAML视图的DataContext
。组合框
不显示调试时在数据上下文中可以看到的4项中的任何一项。我认为这肯定与我异步拉原因标签的事实有关。有没有办法解决这个问题
当我仅使用构造函数中初始化的测试字符串列表测试此代码时,它会按预期工作
这是我目前在XAML中使用的RadComboBox
:
d:DataContext="{d:DesignInstance Type=vm:ATMModifiedReasonViewModel, IsDesignTimeCreatable=True}">
这是我正在使用的ViewModel代码:
public class ATMModifiedReasonViewModel : INotifyPropertyChanged
{
private List<LabelFileModel> _reasonLabels;
public List<LabelFileModel> ReasonLabels { get { return _reasonLabels; } set { _reasonLabels = value; } }
public ATMModifiedReasonViewModel(){
GetReasonLabels();
}
public void GetReasonLabels()
{
LabelFileProvider lfProvider = new LabelFileProvider();
LabelFileModelFilter filter = new LabelFileModelFilter() {LabelDefinition = "ModifiedReason"};
lfProvider.GetFiltered(filter,10, getResult => GetReasonLabelsCallback(getResult));
}
private void GetReasonLabelsCallback(Func<IEnumerable<LabelFileModel>> getResult)
{
try
{
_reasonLabels = (List<LabelFileModel>) getResult();
}
catch (Exception ex)
{
Messenger.Default.Send(new UnhandledExceptionMessage(this, ex));
}
}
}
公共类ATMModifiedReasonViewModel:INotifyPropertyChanged
{
私人名单(标签);;
公共列表ReasonLabels{get{return}ReasonLabels;}set{{ReasonLabels=value;}}
公共ATMModifiedReasonViewModel(){
GetReasonLabels();
}
public void GetReasonLabels()
{
LabelFileProvider lfProvider=新的LabelFileProvider();
LabelFileModelFilter filter=新的LabelFileModelFilter(){LabelDefinition=“ModifiedReason”};
GetFiltered(filter,10,getResult=>GetReasonLabelsCallback(getResult));
}
私有void GetReasonLabelCallback(Func getResult)
{
尝试
{
_reasonLabels=(列表)getResult();
}
捕获(例外情况除外)
{
Send(新的未处理的ExceptionMessage(this,ex));
}
}
}
提前非常感谢您的帮助 如果在运行时重新分配
ReasonLabels
集合,则必须实现并引发事件,否则绑定将不会注意到更改
类似地,如果修改集合本身,例如添加或删除项,则需要实现集合,这将提供事件以触发用户界面中的更新。列表
类型不实现此接口,请改用。如果集合被修改并因此触发绑定更新,它将自动引发事件
public class ATMModifiedReasonViewModel : INotifyPropertyChanged
{
private ObservableCollection<LabelFileModel> _reasonLabels;
public ObservableCollection<LabelFileModel> ReasonLabels
{
get => _reasonLabels;
set
{
if (_reasonLabels = value)
return;
_reasonLabels = value;
OnPropertyChanged();
}
}
// ...your code here.
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
如果在运行时重新分配
ReasonLabels
集合,则必须实现并引发事件,否则绑定将不会注意到更改
类似地,如果修改集合本身,例如添加或删除项,则需要实现集合,这将提供事件以触发用户界面中的更新。列表
类型不实现此接口,请改用。如果集合被修改并因此触发绑定更新,它将自动引发事件
public class ATMModifiedReasonViewModel : INotifyPropertyChanged
{
private ObservableCollection<LabelFileModel> _reasonLabels;
public ObservableCollection<LabelFileModel> ReasonLabels
{
get => _reasonLabels;
set
{
if (_reasonLabels = value)
return;
_reasonLabels = value;
OnPropertyChanged();
}
}
// ...your code here.
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
在回调中设置属性,并从其设置程序中引发PropertyChanged
事件,或者在设置支持字段后,在回调中引发PropertyChanged
事件:
private void GetReasonLabelsCallback(Func<IEnumerable<LabelFileModel>> getResult)
{
try
{
_reasonLabels = (List<LabelFileModel>)getResult();
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ReasonLabels )));
}
catch (Exception ex)
{
Messenger.Default.Send(new UnhandledExceptionMessage(this, ex));
}
}
private void GetReasonLabelCallback(Func getResult)
{
尝试
{
_reasonLabels=(列表)getResult();
PropertyChanged?.Invoke(这是新的propertychangedventargs(nameof(ReasonLabels));
}
捕获(例外情况除外)
{
Send(新的未处理的ExceptionMessage(this,ex));
}
}
框架需要引发事件才能知道何时刷新UI。在回调中设置属性,并从其setter引发PropertyChanged
事件,或者在设置支持字段后在回调中引发PropertyChanged
事件:
private void GetReasonLabelsCallback(Func<IEnumerable<LabelFileModel>> getResult)
{
try
{
_reasonLabels = (List<LabelFileModel>)getResult();
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ReasonLabels )));
}
catch (Exception ex)
{
Messenger.Default.Send(new UnhandledExceptionMessage(this, ex));
}
}
private void GetReasonLabelCallback(Func getResult)
{
尝试
{
_reasonLabels=(列表)getResult();
PropertyChanged?.Invoke(这是新的propertychangedventargs(nameof(ReasonLabels));
}
捕获(例外情况除外)
{
Send(新的未处理的ExceptionMessage(this,ex));
}
}
框架需要引发事件才能知道何时刷新UI。将属性绑定到视图控件时,ViewModel需要实现INotifyPropertyChanged,以便通知视图之前实现的任何属性值更改。我已经把它重新添加进去了,但仍然不太走运。在一些测试之后,似乎实例化了列表,然后向其中添加了项目,从而允许视图解释更改并显示新项目?这看起来可能吗?当将属性绑定到视图的控件时,ViewModel需要实现INotifyPropertyChanged,以便将先前实现的任何属性值更改通知视图。我已经把它重新添加进去了,但仍然不太走运。在一些测试之后,似乎实例化了列表,然后向其中添加了项目,从而允许视图解释更改并显示新项目?这似乎有可能吗?