如何在设计时解决ContentControl ContentTemplateSelector?

时间:2011-05-30 16:43:46

标签: wpf contentcontrol

为什么我无法在设计时解析ContentControl ContentTemplateSelector?
(在运行时它起作用)
Designer(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...
         }

    }

2 个答案:

答案 0 :(得分:2)

H.B。在设计时Application.Current.MainWindownull是正确的。这是通过名称检索资源的更好方法:

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应该具有绑定,而不是硬编码值。

答案 1 :(得分:0)

我怀疑Application.Current.MainWindow未在设计时设置。