Как разрешить ContentControl ContentTemplateSelector во время разработки? - PullRequest
3 голосов
/ 30 мая 2011

Почему я не могу разрешить ContentControl ContentTemplateSelector во время разработки?
(Во время выполнения это работает)
Конструктор (VS2010) показывает исключение:

System.Reflection.TargetInvocationException Exceptionбыл брошен целью вызова.

и

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 ]

2 голосов
/ 30 мая 2011

HB является верным значением Application.Current.MainWindow, равным null во время разработки.Вот лучший способ получить ресурс по имени:

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 должны быть привязки, а не жестко заданные значения.

0 голосов
/ 30 мая 2011

Я подозреваю, что Application.Current.MainWindow не установлен во время разработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...