2017-05-17 46 views
0

我再次遇到與XAML中的綁定有關的問題,我無法自己解決。我有一個ListView和一個ComboBox在裏面。 ListViewItemsSource位於TabControl的視圖模型上,ComboBox.ItemsSource也是如此。我怎樣才能綁定這個集合上的ComboBox在選項卡的屬性上綁定列表視圖中的組合框

這是我到目前爲止的代碼:

<ListView ItemsSource="{Binding ListViewSource}" SelectedItem="{Binding ListViewSelection}" 
      ItemTemplate="{DynamicResource ListViewTemplate}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="..."> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox ItemsSource="{Binding ComboBoxSource}" 
            SelectedValue="{Binding ...}" 
            DisplayMemberPath="DisplayName"/> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> // ... 

而這裏僅僅是在TabViewModelItemsSource性質的頭:

public ObservableCollection<TypeViewModel> ComboBoxSource { get; set; } 
public ObservableCollection<CostViewModel> ListViewSource { get; set; } 

是否可以綁定在該屬性CombBox.ItemsSource

+3

在CellTemplate結合,在猜測:'的ItemsSource =」 {綁定DataContext.ComboBoxSource,RelativeSource = {RelativeSource AncestorType = ListView}}「'。 –

+2

根據之前的評論,相對來源可以做你想做的。不幸的是,你的問題並沒有說明爲什麼你的'ListView'中的每個項目都有相同的下拉菜單,但是如果由於某種原因相對源方法不適合你的需求,那麼對於每個'TypeViewModel '暴露自己的'ComboBoxSource'屬性,它簡單地委託給父視圖模型(例如'... ComboBoxSource {get {return _parentViewModel.ComboBoxSource;}}'或者取決於這些值的來源,甚至可能是一個單身。有很多可能的答案 –

+0

謝謝你們的回答。不幸的是,這並不適用於我,但現在我按照KMCho在答案中解釋它的方式解決了它{Binding ElementName = ControlName,Path = DataContext.ComboBoxSource } – stl

回答

0

只是一個例子。 你有一個TabViewModel這樣的事情。

public class TabViewModel 
{ 
    public ObservableCollection<CostViewModel> ListViewSource { get; set; } 
    public ObservableCollection<TypeViewModel> ComboBoxSource { get; set; } 

    public TabViewModel() 
    { 
     ListViewSource = new ObservableCollection<CostViewModel>(); 
     ListViewSource.Add(new CostViewModel() { CostA = "A", CostB = "B" }); 
     ListViewSource.Add(new CostViewModel() { CostA = "1", CostB = "2" });    

     ComboBoxSource = new ObservableCollection<TypeViewModel>(); 
     ComboBoxSource.Add(new TypeViewModel() { TypeA = "A1", TypeB = "B1" }); 
     ComboBoxSource.Add(new TypeViewModel() { TypeA = "A2", TypeB = "B2" }); 
    } 
} 

,並把DataContextwindow

TabViewModel vm { get; set; }   
public Window1() 
{ 
    vm = new TabViewModel(); 
    this.DataContext = vm;    
    InitializeComponent(); 
} 

,並給予一個名字window,用ElementName

<Window x:Class="WpfApplication5.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Window1" Height="300" Width="300" Name="mainWnd">  
    <Grid>   
     <ListView ItemsSource="{Binding ListViewSource}" > 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="..."> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <ComboBox ItemsSource="{Binding ElementName=mainWnd, Path=DataContext.ComboBoxSource}" DisplayMemberPath="TypeA"/> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
       </GridView> 
      </ListView.View> 
     </ListView>   
    </Grid> 
</Window> 
+0

非常感謝你的偉大的例子!這解決了我的問題。 – stl

相關問題