如何在设计时解决ContentControl ContentTemplateSelector问题?

3

为什么我无法在设计时解析ContentControl ContentTemplateSelector?
(运行时可以)
设计器(VS2010)显示异常:

System.Reflection.TargetInvocationException 目标调用的异常。

System.NullReferenceException 对象引用未设置为对象的实例。

XAML:

<Window.Resources>
    <DataTemplate x:Key="Temp1">
       <TextBox TextWrapping="Wrap" Text="1" Height="20" Width="Auto"/>
    </DataTemplate>

    <local:TemplateSelector x:Key="mySelector"/>
    <Grid>
       <ContentControl ContentTemplateSelector="{StaticResource mySelector}">
          <ContentControl.Content>
               1
          </ContentControl.Content>
       </ContentControl>      
    </Grid>
 </Window.Resources>

C#:

    public class TemplateSelector : DataTemplateSelector
    {
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
             //int num = int.Parse(item.ToString());
             Window win = Application.Current.MainWindow;
             return win.FindResource("Temp1") as DataTemplate;//load template based on num...
         }

    }

你的类真的叫做 myTemplateSelector 吗?这与 XAML 不匹配。 - H.B.
调用没问题,这是一个拼写错误。(如果在运行时正常工作,则表示没有问题) - Mark A
你应该仍然编辑你的问题... - H.B.
我曾经遇到过这个问题,原因是在设计时可能没有像运行时那样拥有某些对象。请确保在尝试这里的一些示例后重新构建您的解决方案,因为我不得不这样做。 - Tower
2个回答

2

H.B.关于在设计时Application.Current.MainWindow为空是正确的。以下是更好的按名称检索资源的方法:

public override DataTemplate SelectTemplate( object item, DependencyObject container ) {
    var element = container as FrameworkElement;
    if ( element != null ) {
        var template = element.TryFindResource( "Temp1" ) as DataTemplate;
        if ( template != null ) {
            return template;
        }
    }
    return base.SelectTemplate( item, container );
}

尽管你的代码的其他部分仍然不完整,但我希望你只是在中途。例如,你的 DataTemplate 应该有绑定而不是硬编码的值。


好的,这是一个例子,ContentControl 将位于 DataGrid 列标题样式内部,它将为每个列标题加载特定模板(基于标题的名称)。 - Mark A

0

我怀疑在设计时Application.Current.MainWindow没有被设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接