Xaml конструктор не может загрузить после создания класса DataTemplate - PullRequest
0 голосов
/ 25 марта 2011

Я создал класс DataTemplate, как показано ниже.

namespace WpfApplication2
{
    class TemplateSelector : DataTemplateSelector
    {

        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {

                if (item != null && item is TaskList)
                {

                     TaskList list = item as TaskList;
                      Window window = Application.Current.MainWindow;
                       if (System.ComponentModel.DesignerProperties.GetIsInDesignMode(window))
                            return null;
                        if (list.Priority == 1)
                        {
                            return window.FindResource("defaultTemplate") as DataTemplate;
                        }
                        else
                        {
                            return window.FindResource("PriTemplate") as DataTemplate;
                        }





                }
                return base.SelectTemplate(item, container);
        }



    }
}

Я уже создал две таблицы данных в своем ресурсе окна, как показано ниже.

<WpfApp2:TaskItem x:Key="taskItem" />
<WpfApp2:TemplateSelector x:Key="tempSelector"></WpfApp2:TemplateSelector>
<DataTemplate x:Key="defaultTemplate">
            <Border Name="border" BorderBrush="LightBlue" BorderThickness="1" Padding="5" Margin="5">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition></RowDefinition>
                        <RowDefinition></RowDefinition>
                        <RowDefinition></RowDefinition>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition></ColumnDefinition>
                        <ColumnDefinition></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Row="0" Grid.Column="0" Text="Name"></TextBlock>
                    <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=Name}" />
                    <TextBlock Grid.Row="1" Grid.Column="0" Text="Item"></TextBlock>
                    <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=Item}" />
                    <TextBlock Grid.Row="2" Grid.Column="0" Text="Description"></TextBlock>
                    <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Path=Description}" />
                </Grid> 
            </Border>
        </DataTemplate>
        <DataTemplate x:Key="PriTemplate">
            <Border BorderBrush="Red" BorderThickness="2" Padding="5" Margin="4">
                <DockPanel HorizontalAlignment="Center">
                    <TextBlock Text="{Binding Description}" Margin="4"></TextBlock>
                    <Image Margin="4,20,20,20" Source="1.jpg"></Image>

                </DockPanel>
            </Border>

        </DataTemplate>

Но после загрузки конструктора я получил следующее исключение и моя форма не может загрузить.

System.Reflection.TargetInvocationException
Exception has been thrown by the target of an invocation.
   at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
   at System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   at System.Delegate.DynamicInvokeImpl(Object[] args)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)


System.ArgumentNullException
Value cannot be null.
Parameter name: element

Когда я запускаю это приложение, оно работает нормально.Просто я не вижу в режиме дизайна.Пожалуйста, порекомендуйте.спасибо.

1 Ответ

3 голосов
/ 25 марта 2011

Я подозреваю, что Application.Current.MainWindow возвращает ноль, когда вы находитесь в режиме разработки, поэтому вызов метода FindResource для нулевого объекта.

Попробуйте эту строку вместо:

if ((window == null) || (System.ComponentModel.DesignerProperties.GetIsInDesignMode(window)))
    return null;

Если это не сработает, настройте себя на отладку компонента в режиме разработки. Инструкции приведены здесь: Пошаговое руководство. Отладка пользовательских элементов управления WPF во время разработки

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