Я немного новичок .net, и я работаю над своим первым большим проектом Silverlight. Так что извините за отсутствие жаргона и продолжительности вопроса. Но моя проблема заключается в следующем.
Проект строится по шаблону MVVM (в данном случае я использую LightMVVM). Большинство представлений содержат списки. Эти списки должны обрабатывать несколько различных типов данных, каждый из которых имеет свой визуальный вид. После некоторого возни я декодировал tp попробуйте эту реализацию для выбора таблицы данных:
http://silverscratch.blogspot.com/2010/04/changing-data-templates-at-run-time.html
Некоторые из моих предметов, однако, имеют подэлементы управления, которые должны общаться с моделью представления. Из того, что я читал, Команды с привязками элементов - лучший способ справиться с этим.
Так, например:
<Grid x:Name="NavMainLayoutRoot" DataContext="{Binding Source={StaticResource NavMainViewModelDataSource}}" Margin="15,0,0,0">
....
<ListBox x:Name="MenuListBox" HorizontalAlignment="Left" Background="{x:Null}" BorderBrush="{x:Null}" Foreground="White" ItemsSource="{Binding Items}" ItemContainerStyle="{StaticResource MainNavigationButtonStyle}" Padding="0" VerticalAlignment="Top" >
<ListBox.RenderTransform>
<CompositeTransform/>
</ListBox.RenderTransform>
<ListBox.ItemTemplate>
<DataTemplate>
<xxxControls:SelectableContentControl TemplateName="{Binding Path=Type}" Content="{Binding Details}" IsTabStop="{Binding IsHitTestEnabled}">
<xxxControls:SelectableContentControl.Templates>
<DataTemplate>
<local:GenericItem />
</DataTemplate>
<DataTemplate x:Name="navbutton">
<local:MainNavItem />
</DataTemplate>
</xxxControls:SelectableContentControl.Templates>
</xxxControls:SelectableContentControl>
</DataTemplate>
</ListBox.ItemTemplate>
....
И MainNavItem, упрощенно это:
<Grid x:Name="NavItemRoot" VerticalAlignment="Top" Margin="0,0,0,0">
<Button Content="{Binding Label}" VerticalAlignment="Top" Style="{StaticResource MainNavItemButtonStyle}" HorizontalAlignment="Left" Margin="5,0" Command="{Binding DataContext.NavButtonClick, ElementName=NavMainLayoutRoot}"/>
</Grid>
Проблема в том, что это не сработало. Так что ради ухмылки я пошел дальше, скопировал и вставил код для MainNavItem прямо в тег и, как по волшебству, он начал работать.
Поскольку я многократно использую многие из этих шаблонов элементов по всему приложению, иметь их в красивых внешних файлах - это очень приятно , и я не хочу от них отказываться.
((Если подумать, этот пример не самый лучший, достаточно сказать, что некоторые из этих шаблонов данных содержат несколько элементов управления, и я не могу просто использовать selectedItem в списке для обработки выбранных событий.))
Так что любые предложения приветствуются. Какая лучшая практика здесь?