silverlight从VM集合绑定到视图不工作需要一些帮助

问题描述:

我知道我在这里失去了一些东西,我可以使用一个指针。在一个项目中,我有一个扩展控件,当点击这个控件时,它会对我的项目中的POCO进行一次RIA调用,以检索第二组数据。我在这里使用SimpleMVVM工具包,所以请让我知道是否需要扩展任何其他领域。silverlight从VM集合绑定到视图不工作需要一些帮助

内XAML膨胀机布局为

<toolkit:Expander Header="Name" Style="{StaticResource DetailExpanderSytle}" > 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="Expanded"> 
          <ei:CallMethodAction 
           TargetObject="{Binding Source={StaticResource vm}}" 
           MethodName="showWarrantNameDetail"/> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 
        <StackPanel Orientation="Vertical"> 
         <sdk:DataGrid AutoGenerateColumns="true" ItemsSource="{Binding NameResult}" AlternatingRowBackground="Gainsboro" HorizontalAlignment="Stretch" MaxHeight="200"> 

         </sdk:DataGrid> 
         <local:NameContainer DataContext="{Binding}" /> 
        </StackPanel> 
       </toolkit:Expander> 

我使用加上简单MVVM表达DLL来获得在图型号VS命令的方法。 内,我有以下代码

 public void showWarrantNameDetail() 
    { 
     //set flags 
     IsBusy = true; 
     CanDo = false; 
     EntityQuery<WarrantNameDataView> query = App.cdContext.GetWarrantNameDataViewsQuery().Where(a => a.PrimaryObjectId == Convert.ToInt32(RecID)); 
     Action<LoadOperation<WarrantNameDataView>> completeProcessing = delegate(LoadOperation<WarrantNameDataView> loadOp) 
     { 
      if (!loadOp.HasError) 
      { 
       processWarrantNames(loadOp.Entities); 
      } 
      else 
      { 
       Exception error = loadOp.Error; 
      } 
     }; 
     LoadOperation<WarrantNameDataView> loadOperation = App.cdContext.Load(query, completeProcessing, false); 
    } 

    private void processWarrantNames(IEnumerable<WarrantNameDataView> entities) 
    { 
     ObservableCollection<WarrantNameDataView> NameResult = new ObservableCollection<WarrantNameDataView>(entities);   
     //we're done 
     IsBusy = false; 
     CanDo = true; 
    } 

当我设置的processWarrantName休息我可以看到NameResult设为回报的X个视图模型。但在视图中,datagrid不会被填充任何东西?

任何人都可以帮助我理解我需要做什么与绑定获取gridview填充?与其他集合绑定的窗体的其他区域显示数据,因此我知道我已正确设置了视图的数据上下文。我已经尝试了数据上下文以及Items Source并且没有返回? 当我在代码上设置中断时,集合返回如下,所以我可以看到数据正在返回。任何关于我失踪的建议我将不胜感激。

enter image description here

至于DataContext的,我后面设置它在代码中的页面如下:提前

 var WarrantDetailViewModel = ((ViewModelLocator)App.Current.Resources["Locator"]).WarrantDetailViewModel; 
     this.DataContext = WarrantDetailViewModel; 
     this.Resources.Add("vm", WarrantDetailViewModel); 

感谢您的任何建议。

使ObservableCollection<WarrantNameDataView> NameResult成为ViewModel类的公共属性。您的视图将无法绑定到具有私有方法范围(或公共方法范围或私有成员范围)的东西。

//declaration 
public ObservableCollection<WarrantNameDataView> NameResult { get; set } 

//in the ViewModel constructor do this 
NameResult = new ObservableCollection<WarrantNameDataView>(); 

//then replace the original line in your method with: 
//EDIT: ObservableCollection has no AddRange. Either loop through 
//entities and add them to the collection or see OP's answer. 
//NameResult.AddRange(entities); 

如果processWarrantNames被调用一次以上,你可能需要 之前调用NameResult.Clear()调用的AddRange() 加入到集合中。

+0

谢谢菲尔就是这样。我非常关注收藏(IENum to OC),我完全忘记了将该物业设置为公开。 – rlcrews

菲尔在将财产设置为公开时是正确的。我要添加的一个注释是SL或ObservableCollection类中没有AddRange属性,我可以找到它。我用下面的代码

private ObservableCollection<WarrantNameDataView> warrantNameResult; 
    public ObservableCollection<WarrantNameDataView> WarrantNameResult 
    { 
     get { return warrantNameResult; } 
     set 
     { 
      warrantNameResult = value; 
      NotifyPropertyChanged(vm => vm.WarrantNameResult); 
     } 
    } 

能够分配实体的OC内,然后返回方法

WarrantNameResult = new ObservableCollection<WarrantNameDataView>(entities); 

这个工作,并传递到UI数据的集合。

+0

编辑我的答案,以免混淆任何碰到它的人。很高兴听到你的工作。 –