2010-10-30 119 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> 
相關問題