2011-02-23 50 views
2

我在我的第一個「生產」 WPF應用程序在外面打工,我現在遇到的問題。
我有一些類似於下面的例子的代碼。我遇到的問題是我無法填充ComboBox。我猜想這是因爲GridItemsSource是‘從能夠看到的視圖模型的任務集合堵’的ComboBox,但我只是猜測。其他一切都是正確的數據綁定。如何將DataGridComboBoxColumn綁定的ItemSource

我SO沖刷,發現this問題;這聽起來和我想要做的完全一樣,但它對我來說不起作用。

任何想法,爲什麼我不能得到ComboBox來填充?

型號:

public class Activity{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public Task Task { get; set; } 
} 

public class Task{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
} 

視圖模型:

public ApprovalViewModel{ 
    public ObservableCollection<Activity> Activities { /* ... property logic */ } 
    public ObservableCollection<Task> Tasks { /* ... property logic */ } 
} 

查看:

<DataGrid ItemsSource="{Binding Activities}" AutoGenerateColumns="False"> 
    <DataGrid.Resources> 
     <DataTemplate x:Key="displayTemplate"> 
      <TextBlock Text="{Binding Task.Title}"/> 
     </DataTemplate> 
     <DataTemplate x:Key="editTemplate"> 
      <ComboBox ItemsSource="{Binding Tasks}" <!--I think the problem is here--> 
       SelectedValue="{Binding Task}" 
       DisplayMemberPath="Title"/> 
     </DataTemplate> 
    </DataGrid.Resources> 
    <DataGrid.Columns> 
     <DataGridComboBoxColumn DisplayMemberPath="Title"/> 
     <DataGridTextColumn Binding="{Binding User}" Header="User"/> 
     <DataGridTextColumn Binding="{Binding Task.Project.Title}" Header="Project"/> 
     <DataGridTemplateColumn 
      Header="Task" 
      CellTemplate="{StaticResource displayTemplate}" 
      CellEditingTemplate="{StaticResource editTemplate}"/> 
     <DataGridTextColumn Binding="{Binding Description}" Header="Description"/> 
    </DataGrid.Columns> 
</DataGrid> 

編輯:正確ComboBox代碼是在這裏:

<ComboBox 
    ItemsSource="{Binding Path=DataContext.Tasks, 
         RelativeSource={RelativeSource FindAncestor, 
             AncestorType={x:Type UserControl}}}" 
    SelectedValue="{Binding Task.Title}" 
    SelectedValuePath="Title" 
    DisplayMemberPath="Title"/> 

回答

5

你是問題所在是正確的,即結合相對於Activity。所以它正在尋找Activity.Tasks

您鏈接到有正確的方法的帖子,你只需要調整它您的具體情況。

ItemsSource="{Binding Path=DataContext.Tasks, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" 

這將回到可視化樹尋找一個窗口,其中有一個DataContext.Tasks屬性。

您的代碼示例在窗口內嗎?如果沒有,則需要更改{x:Type},其次是在此對象上設置DataContext?如果沒有,您需要將其設置爲ViewModel。

+0

謝謝,工作完美!我不得不將x:Type設置爲UserControl。此外,我很困惑(現在仍然是),因爲FindAncestor不在Intellisense中顯示。它似乎工作,但。 – 2011-02-23 15:07:59