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并且没有返回? 当我在代码上设置中断时,集合返回如下,所以我可以看到数据正在返回。任何关于我失踪的建议我将不胜感激。
至于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()
加入到集合中。
菲尔在将财产设置为公开时是正确的。我要添加的一个注释是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数据的集合。
编辑我的答案,以免混淆任何碰到它的人。很高兴听到你的工作。 –
谢谢菲尔就是这样。我非常关注收藏(IENum to OC),我完全忘记了将该物业设置为公开。 – rlcrews