2010-10-30 86 views
3

我们使用Caliburn.Micro/Silverlight 4并且生活很好。如何绑定silverlight datagrid组合框itemSource以查看模型

我想将一个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> 

回答

4

在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;} 
} 

这似乎矫枉过正,但在某些情况下每个组合可实际上包含每个不同的选择数据项,基于一些业务规则。 在简单的情况MyItem可以只暴露从父MyVM未来共同的清单:

public class MyItem { 
    ... 
    public IEnumerable<Officer> Officers { 
    get { return _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;} 
} 

的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> 
相关问题