2011-01-24 3 views
0

Приложение WPF Я унаследованный содержит значительное количество XAML, который следует шаблону, как:найти лучший способ, чтобы написать комплекс WPF Uis

<Window ...> 
    <Grid> 
     <z:SomeUserControl> 
      <z:AnotherUc> 
       <Label /> <Button /> <ComboBox /> 
      </z:AnotherUc> 
      <z:AnotherUc> 
       <Label /> <Button /> <ComboBox /> 
      </z:AnotherUc> 
     </z:SomeUserControl> 
    </Grid> 
</Window> 

Других слова, мы секция интерфейса сгруппированы по UserControl, часто вложенные в другие UserControls. В какой-то момент контент определяется с помощью основных элементов управления содержимым WPF.

Проблема, которую мы пытаемся справиться с, что х: атрибут Name не может быть применен к любому из внутренних большинства элементов управления из-за пресловутое ограничение WPF:

Cannot set Name attribute value {0} on element {1}. {1} is under the scope of element {2}, which already had a name registered when it was defined in another scope

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

Однако, если Microsoft не намерена разрешать это так называемое «ограничение», должен быть найден лучший способ. Учитывая, что был размещен в использовании файла шаблона CS + external XAML, как показано на рабочем столе GaryGJohnson на сайте connect. Однако у этого есть чувство sphagetti, и все, что прерывает привязки, - не-go.

+0

У меня возникла аналогичная проблема, и я использовал элемент CustomControl. Но теперь я знаю, что все можно сделать с помощью MVVM и поведения. Поэтому я стараюсь избегать использования свойства x: Name. – vorrtex

ответ

1

Лучшим вариантом здесь является, как правило, избежать использования кода позади этих «внутренних» элементов. Вы все равно можете использовать привязку данных, поэтому привязка их к свойствам в вашем DataContext будет работать правильно.

Другой альтернативой, конечно же, является представление Label/Button/ComboBox непосредственно в качестве свойств зависимостей класса AnotherUc. Это позволит вам использовать их непосредственно в качестве членов UserControl, что позволяет избежать проблемы с определением области охвата.

Недостатком этого, конечно же, является то, что вы должны настроить пользовательский элемент управления для конкретной комбинации элементов, а не позволять размещать какие-либо элементы управления внутри него.

1

Звучит как беспорядок по дизайну. Вы можете создать свой собственный AttachedProperty - MyNameProperty, установить его в свой XAML и написать свой собственный помощник логического/визуального дерева, который сработает. Я не говорю, что я это сделаю, но если вам нужно быстрое обходное решение (без радикальной редизайна вашей модели состава пользовательского интерфейса), это может сделать вас.

+0

Если бы вы могли опубликовать какой-нибудь свободный xaml, я бы поделился своими мыслями. Тот, который вы опубликовали выше, выглядит хорошим кандидатом на элементы ItemsControl, то есть повторяющиеся элементы, имеющие общие элементы пользовательского интерфейса, могут быть учтены как элементы ItemsControl. –

Смежные вопросы