2011-06-03 84 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