DataTemplateSelector/Binding不起作用



这是我的ViewModel:

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(...) { ...}
}

这是我的MainWindow(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>

窗格代码模板选择器类:

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正在工作。选择了正确的模板,我可以看到计算器控件。但是计算器控件中的TemplateSelector不起作用。在CalculatorTemplateSelector.SelectTemplate中,项参数始终为null。但我需要CalculatorViewModel实例。我想我的问题是一个有约束力的问题,但我没有找到解决办法。有什么想法吗?

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

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

应为:RaisePropertyChanged("Mode");}}

我可能会问,但这只是为了给你带来我的一部分才华。。。我自己刚刚找到了一个解决方案:将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调用