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

时间:2011-09-22 01:17:19

标签: c# silverlight xaml mvvm

我知道我在这里遗漏了一些东西,我可以使用指针。在一个项目中,当点击该控件时,我有一个扩展器控件,它对我项目中的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填充?表单中与其他集合绑定的其他区域显示数据,因此我知道我已正确设置了视图的数据上下文。我已经尝试了数据上下文以及项目源而且没有回报? 当我在代码上设置一个中断时,集合返回如下,所以我可以看到正在返回数据。关于我所缺少的任何建议我会非常感激。

enter image description here

关于页面datacontext我在后面的代码中设置它如下:

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

提前感谢任何建议。

2 个答案:

答案 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。