2012-08-24 151 views
0

这是我的ViewModel:DataTemplateSelector /绑定不起作用

class MainViewModel : ViewModelBase 
{ 
    private CalculatorViewModel calc; 
    public CalculatorViewModel Calculator {get {return calc; }set {calc = value; RaisePropertyChanged("Calculator");}} 
} 

class CalculatorViewModel : ViewModelBase 
{ 
    private CalculatorMode mode; 
    public CalculatorMode Mode {get {return mode;}set{mode=value; RaisePropertyChanged("CalculatorMode");}} 

    public CalculatorViewModel() 
    { 
     Mode = new HexMode(); 
    } 
} 
abstract class CalculatorMode : ViewModelBase 
{ 
    abstract int Calculate(...); 
} 
class HexMode : CalculatorMode 
{ 
public int Calculate(...) { ...} 
} 

这是我的主窗口(一个MainViewModel实例被设置为Windows'的DataContext):

<ad:DockingManager > 
      <ad:DockingManager.LayoutItemTemplateSelector> 
       <vm:PanesTemplateSelector> 
        <vm:PanesTemplateSelector.FileViewTemplate> 
         <DataTemplate> 
          <h:MyDocument /> 
         </DataTemplate> 
        </vm:PanesTemplateSelector.FileViewTemplate> 
        <vm:PanesTemplateSelector.CalculatorViewTemplate> 
         <DataTemplate> 
          <w:Calculator /> 
         </DataTemplate> 
        </vm:PanesTemplateSelector.CalculatorViewTemplate> 
       </vm:PanesTemplateSelector> 
      </ad:DockingManager.LayoutItemTemplateSelector> 
</ad:DockingManager> 

的代码PanesTemplateSelector级:

public DataTemplate FileViewTemplate 
     { 
      get; 
      set; 
     } 

     public DataTemplate CalculatorViewTemplate 
     { 
      get; 
      set; 
     } 

     public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container) 
     { 
      if (item is DocumentViewModel) 
       return FileViewTemplate; 

      if (item is CalcualtorViewModel) 
       return CalculatorViewTemplate; 

      return base.SelectTemplate(item, container); 
     } 

计算器控制的内容:

<Grid Name="main"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <ContentControl Name="content"> 
     <ContentControl.ContentTemplateSelector> 
      <vm:CalculatorTemplateSelector> 
       <vm:CalculatorTemplateSelector.DefaultView> 
        <DataTemplate> 
         <TextBlock Text="Dummy for normal view" Foreground="Wheat" /> 
        </DataTemplate> 
       </vm:CalculatorTemplateSelector.DefaultView> 
       <vm:CalculatorTemplateSelector.HexView> 
        <DataTemplate> 
         <TextBlock Text="Dummy für Hexview" Foreground="Gray"/> 
        </DataTemplate> 
       </vm:CalculatorTemplateSelector.HexView> 
      </vm:CalculatorTemplateSelector> 
     </ContentControl.ContentTemplateSelector> 
    </ContentControl> 
</Grid> 

的CalculatorTemplateSelector级的代码:

public DataTemplate HexView 
     { 
      get; 
      set; 
     } 

     public DataTemplate DefaultView 
     { 
      get; 
      set; 
     } 

     public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container) 
     { 
      CalculatorViewModel cjmv = (CalculatorViewModel)item; 

      if (cjmv != null) 
      { 
       if (cjmv.Mode is HexMode) 
        return HexView; 

     return DefaultView; 
      } 

      return base.SelectTemplate(item, container); 
     } 

第一TemplateSelector正在工作。选择了正确的模板,我可以看到计算器控制。但是Calculator-Control中的TemplateSelector不起作用。在CalculatorTemplateSelector.SelectTemplate中,项目参数始终为空。但我需要那里的CalculatorViewModel实例。我想我的问题是一个有约束力的问题,但我没有找到解决方案。有任何想法吗?

+1

谢尔顿·库珀的通知..问一个问题!哦,我的日子!艾米如何? :P 无论如何,因为你的问题可能是回答..你可能想要更改此行'CalculatorViewModel cjmv =(CalculatorViewModel)项目;'到'CalculatorViewModel cjmv =项目作为CalculatorViewModel;'否则可能会抛出异常.. –

+0

+1谢尔顿库珀问一个问题! – franssu

回答

0

TL;博士,但有一点是肯定的:

public CalculatorMode Mode [...] RaisePropertyChanged("CalculatorMode");}} 

应该是:RaisePropertyChanged("Mode");}}

0

我可以问,但只取你我辉煌的一部分...我只是找到了一个解决方案我: 添加DataContext的,绑定到一个ContentPresenter(而不是ContentControl中)

<ContentPresenter Name="content" DataContext="{Binding}"> 

,改变SelectTemplate的实现的:

public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container) 
     { 
      ContentPresenter cp = container as ContentPresenter; 
      if (cp != null) 
      { 
       CalculatorViewModel model = cp.DataContext as CalculatorViewModel; 
       if (model != null) 
       { 
        if (model.Mode is DefaultMode) 
         return DefaultView; 
        if (model.Mode is HexMode) 
         return HexView; 
       } 
      } 
      return base.SelectTemplate(item, container); 
     } 

无论如何,感谢错RaisePropertyChanged呼叫