2011-06-03 61 views
1

我有一個使用MVC的應用程序。它有一個畫布和屬性網格。在畫布中選擇一個項目時。屬性網格應顯示其詳細信息。MVC設計問題

所以我做了一個事件監聽器,當在畫布中選擇了一個項目時,它向控制器發出一個事件,它將選定的項目傳遞給屬性網格以顯示細節。

型號:

含有

Item對象名稱,描述

控制器:

protected Controller(object model, FrameworkElement view) 
{ 
    this._model = model; 
    this._view = view; 
} 

public virtual void Initialize() 
{ 
    View.DataContext = Model; 
} 

檢視:

<TextBlock>Status</TextBlock> 
<ComboBox ItemsSource="?????"/> 

當視圖是屬性網格和模型是所選擇的項目。

問題是在屬性網格中有一個包含查找值的下拉列表如何獲取下拉值,因爲屬性網格的datacontext已經設置爲不包含對這些引用的選定項目查找項目。

我知道很容易使用自定義代碼來做到這一點。但我不想違反MVC的約定。

+0

需要更多的信息才能給出明智的答案(這就是爲什麼imho沒有人回答,直到現在:)) 我會這樣做: - 創建一個數據接口,比如說,IListProvider可以有一個方法叫做「 ProvideList「接受TStringBuilder作爲參數 - 爲接口創建單一實現類 - 爲上下文創建接口屬性並使用它來選擇」正確「提供者。 不過,我認爲你需要概述你的代碼:) – 2011-06-03 20:52:43

+0

@Andrea:雖然只有7分鐘... – 2011-06-03 20:54:01

+0

大聲笑!我沒有注意到:P – 2011-06-03 20:57:31

回答

2

綁定到源,而不是DataContext的,來源是由ElementName提供,RelativeSource & Source,這樣你就可以命名例如查看和使用ElementName把它作爲源,則Path可能在DataContext.LookupValues或任何你的財產model( - View的DataContext是你的模型 - )被調用。


例如,

<Window ... 
    Name="Window"> 
    <ItemsControl ItemsSource="{Binding Items}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock Text="{Binding Name}" /> 
        <ComboBox ItemsSource="{Binding ElementName=Window, Path=DataContext.Occupations}" 
          SelectedItem="{Binding Occupation}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

    <!-- ... ---> 

編輯:您的問題似乎是,你不通過你所需要的信息,考慮設計仍然授予您訪問超過一些名單剛剛的SelectedItem,例如

<Window ... 
     Name="Window"> 
    <ListBox Name="listBox" ItemsSource="{Binding Data}" /> 
    <ContentControl DataContext="{Binding ElementName=listBox, Path=SelectedItem}"> 
     <ComboBox ItemsSource="{Binding ElementName=Window, Path=DataContext.Occupations}" 
       SelectedItem="{Binding Occupation}" /> 
    </ContentControl> 

    <!-- ... ---> 

的所述ContentControlDataContext可以是列表框的的SelectedItem但內部的組合框仍然可以引用應提供了必要的信息的窗口的DataContext的。

這與我的第一個示例類似,DataTemplate中的DataContext始終是集合的一個項目,但您可以使用綁定中的源訪問外部DataContext。

+0

謝謝你正是我需要的。 – 2011-06-03 21:31:21

+0

你能舉個例子嗎? – 2011-06-03 22:37:14

+0

新增了一個例子,注意'ComboBox'的'Window.Name'和'ItemsSource'綁定。 – 2011-06-03 22:42:47