Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从ViewModel WPF更新XAML中的组合框ObservableCollection绑定_C#_Wpf_Xaml_Silverlight_Telerik - Fatal编程技术网

C# 从ViewModel WPF更新XAML中的组合框ObservableCollection绑定

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

我在WPF工作,有一个视图模型
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,以便将先前实现的任何属性值更改通知视图。我已经把它重新添加进去了,但仍然不太走运。在一些测试之后,似乎实例化了列表,然后向其中添加了项目,从而允许视图解释更改并显示新项目?这似乎有可能吗?