DataTemplate во время разработки - PullRequest
2 голосов
/ 25 октября 2009

В одной из моих первых попыток с WPF я зашел слишком далеко:

У меня есть объект, которому нужен другой шаблон данных в зависимости от одного из его свойств. Другими словами if (object.property=="multi"), тогда шаблон должен быть комбо и т. Д.

Теперь я пошел дальше и, очевидно, использовал DataTemplateSelector, чтобы применить требуемый шаблон. И во время выполнения это работает. Во время разработки vs2008 конструктор жалуется, потому что DataTemplateSelector использует Application.Current.MainWindow.FindResource, чтобы найти подходящий шаблон для применения, и, очевидно, Application.Current во время разработки не является моим приложением, поэтому ресурс не может быть найден, поэтому дизайнер бросает исключение.

Учитывая, что я хотел бы, чтобы другие люди могли изменять шаблоны, мне действительно нужна поддержка во время разработки.

Есть ли решение моей проблемы? Является ли весь мой подход совершенно ошибочным?

Ответы [ 3 ]

1 голос
/ 25 октября 2009

Вы можете добавить свойство зависимости в ваш селектор шаблонов для каждого типа шаблона и ссылаться на шаблоны в XAML:

<local:MyTemplateSelector x:Key="myTemplateSelector"
  Template1="{StaticResource tpl1}"
  Template2="{StaticResource tpl2}"
/>

Или просто создайте экземпляр и назначьте селектор шаблона в коде позади.

0 голосов
/ 28 октября 2009

Я думаю, что нашел ответ на свой вопрос (хотя у него есть свои проблемы).

DataTemplateSelector должен иметь открытые свойства для хранения возможных шаблонов. Когда вы создаете экземпляр DataTemplateSelector в XAML, вы передаете ему соответствующие шаблоны, что-то вроде

Это обеспечивает поддержку во время разработки. С другой стороны, требуется, чтобы вы знали, каковы возможные шаблоны при создании экземпляра селектора, что не всегда так.

0 голосов
/ 26 октября 2009

Это просто не в моей голове, так что я не уверен, что это работает, но как насчет использования datatriggers и назначения соответствующего шаблона с установщиком.

Что-то вроде "

<ContentControl>
        <ContentControl.Style>
            <Style TargetType="{x:Type ContentControl}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Property}" Value="multi">
                        <Setter Property="ContentTemplate" Value="{StaticResource templateKey}" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ContentControl.Style>
        ...
    </ContentControl>
...