Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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
如何将silverlight datagrid组合框itemSource绑定到viewModel_Silverlight_Caliburn - Fatal编程技术网

如何将silverlight datagrid组合框itemSource绑定到viewModel

如何将silverlight datagrid组合框itemSource绑定到viewModel,silverlight,caliburn,Silverlight,Caliburn,我们正在使用Caliburn.Micro/Silverlight 4,生活很美好 我试图将combobox的itemsSource绑定到viewModel,但这似乎不可能,因为combobox已经绑定到它自己行的dataItem。填充组合的逻辑会随着屏幕上的其他数据而改变,因此我不能像以前那样使用静态列表 是否有办法将目录绑定到viewModel???我尝试了元素到元素的绑定,但在网格中似乎从来都不起作用 <Controls:DataGridTemplateColumn x:

我们正在使用Caliburn.Micro/Silverlight 4,生活很美好

我试图将combobox的itemsSource绑定到viewModel,但这似乎不可能,因为combobox已经绑定到它自己行的dataItem。填充组合的逻辑会随着屏幕上的其他数据而改变,因此我不能像以前那样使用静态列表

是否有办法将目录绑定到viewModel???我尝试了元素到元素的绑定,但在网格中似乎从来都不起作用

       <Controls:DataGridTemplateColumn x:Name="FooNameCol" Header="Foo" MinWidth="200">
            <Controls:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>

                    <StackPanel>
                        <TextBlock Text="{Binding Path=Foo.ShortName}" 
                                   Style="{StaticResource DataGridTextColumnStyle}"/>
                    </StackPanel>

                </DataTemplate>
            </Controls:DataGridTemplateColumn.CellTemplate>
            <Controls:DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>

                    <ComboBox DisplayMemberPath="ShortName"   
                              MinWidth="200" MinHeight="25"
                              SelectedItem="{Binding Path=Officer, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}"
                              ItemsSource="{Binding Officers, Source={StaticResource ReferenceListRetriever}}" />

                </DataTemplate>
            </Controls:DataGridTemplateColumn.CellEditingTemplate>
        </Controls:DataGridTemplateColumn>

在DataTemplate中,DataContext绑定到相应列表的每个单个项;由于所有绑定都隐式引用DataContext,因此必须确保路径有效,从单个数据项开始

在您的场景中,要使指定的绑定正常工作,您应该使VM的形状如下:

public class MyVM {
   public IEnumerable<MyItem> Items {get;}
}

public class MyItem {
  public Foo Foo {get;}
  public Officer Officer {get;set;}
  public IEnumerable<Officer> Officers {get;}
}
公共类MyVM{
公共IEnumerable项{get;}
}
公共类MyItem{
公共Foo Foo{get;}
公职人员{get;set;}
公职人员{get;}
}
这似乎有些过分,但在某些情况下,每个组合实际上可以根据某些业务规则为每个数据项包含不同的选择。 在更简单的情况下,MyItem可以只公开来自父MyVM的公共列表:

public class MyItem {
  ...
  public IEnumerable<Officer> Officers {
    get { return _parent.AvailableOfficers; }
  }
}
公共类MyItem{
...
公职人员{
获取{return\u parent.AvailableOfficers;}
}
}
如果您真的无法接受它,并且更愿意将可用人员列表仅保留在根VM中,那么您可以使用Xaml方面的技巧:

public class MyVM {
  public IEnumerable<MyItem> Items {get;}
  public IEnumerable<Officer> Officers {get;}
}

public class MyItem {
  public Foo Foo {get;}
  public Officer Officer {get;set;}
}
公共类MyVM{
公共IEnumerable项{get;}
公职人员{get;}
}
公共类MyItem{
公共Foo Foo{get;}
公职人员{get;set;}
}
Xaml:


...
...
...
...
<UserControl ...>
  ...
  <AnyFrameworkElementAtThisLevel Name="bridge" />
  ...
  <Controls:WhateverGrid>
     ...
     <Controls:DataGridTemplateColumn ...>
        <Controls:DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
              ...
            </DataTemplate>
        </Controls:DataGridTemplateColumn.CellTemplate>
        <Controls:DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
                <ComboBox DisplayMemberPath="ShortName"   
                          SelectedItem="{Binding Path=Officer, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}"
                          ItemsSource="{Binding DataContext.Officers, ElementName=bridge}" />

            </DataTemplate>