【问题标题】:DataTemplateSelector / Binding does not workDataTemplateSelector / 绑定不起作用
【发布时间】:2012-08-24 06:54:35
【问题描述】:

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

PanesTemplateSelector-Class 的代码:

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-Class 的代码:

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 实例。我想我的问题是一个绑定问题,但我没有找到解决方案。有什么想法吗?

【问题讨论】:

  • Sheldon Cooper.. 提问!哦,我的日子!艾米怎么样? :P 无论如何,因为您的问题可能已得到解答..您可能希望将此行 CalculatorViewModel cjmv = (CalculatorViewModel)item; 更改为 CalculatorViewModel cjmv = item as CalculatorViewModel; 否则可能会引发异常..
  • +1 谢尔顿库珀提问!

标签: c# wpf binding datatemplate datatemplateselector


【解决方案1】:

tl;dr 但有一件事是肯定的:

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

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

【讨论】:

    【解决方案2】:

    我可能会问,但只是为了让您了解我的才华......我自己找到了一个解决方案: 将 DataContext-Binding 添加到 ContentPresenter(而不是 ContentControl)

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

    并将 SelectTemplate-Implementation 更改为:

     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-Call 通知

    【讨论】:

      猜你喜欢
      • 2014-03-27
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 2018-04-12
      • 2020-02-29
      • 2011-10-02
      • 2018-11-07
      • 2017-11-02
      相关资源
      最近更新 更多