我知道我在这里遗漏了一些东西,我可以使用指针。在一个项目中,当点击该控件时,我有一个扩展器控件,它对我项目中的POCO进行RIA调用,以检索第二组数据。我在这里使用SimpleMVVM工具包,如果我需要扩展任何其他区域,请告诉我。
在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>
我使用表达式Dll与Simple MVVM结合来获取视图模型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个返回值。但是在视图中数据网格没有填充任何东西?
任何人都可以帮我理解我需要做什么来绑定才能使gridview填充?表单中与其他集合绑定的其他区域显示数据,因此我知道我已正确设置了视图的数据上下文。我已经尝试了数据上下文以及项目源而且没有回报? 当我在代码上设置一个中断时,集合返回如下,所以我可以看到正在返回数据。关于我所缺少的任何建议我会非常感激。
关于页面datacontext我在后面的代码中设置它如下:
var WarrantDetailViewModel = ((ViewModelLocator)App.Current.Resources["Locator"]).WarrantDetailViewModel;
this.DataContext = WarrantDetailViewModel;
this.Resources.Add("vm", WarrantDetailViewModel);
提前感谢任何建议。
答案 0 :(得分:0)
使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,您可能需要在调用AddRange()添加到集合之前调用NameResult.Clear()。
答案 1 :(得分:0)
菲尔将房产设置为公开是正确的。我要添加的一个注释是我找不到SL或ObservableCollection类中没有AddRange属性。我能够使用以下代码将实体分配给OC
private ObservableCollection<WarrantNameDataView> warrantNameResult;
public ObservableCollection<WarrantNameDataView> WarrantNameResult
{
get { return warrantNameResult; }
set
{
warrantNameResult = value;
NotifyPropertyChanged(vm => vm.WarrantNameResult);
}
}
然后在return方法中
WarrantNameResult = new ObservableCollection<WarrantNameDataView>(entities);
这工作并将UI传递给UI。