2011-04-12 16 views
6

Durumumun çok hızlı ve basitleştirilmiş açıklaması burada. Ben Hyperlink kontroller için bir stil tanımlanmış ve onlar Command tesiste ViewModel sınıf (basitleştirilmiş) tarif edilen komut ile binded var:WPF: Stillerde ve/veya veri şablonlarında (MVVM) ciltleme komutları?

<Window.Resources> 
    ... 
    <Style x:Key="hyperlinkStyle" TargetType="Hyperlink"> 
    ... 
    <Setter Property="Command" Value="{Binding Path=OpenHyperlinkCommand}" /> 
    ... 
    </Style> 
    ... 
</Window.Resources> 

Sonraki, ben tasarlıyorum penceresinde bir içerik kontrolü yarattı. Pencere kaynaklarında yazılmış bir veri şablonuna sahiptir. Bu veri şablonunun içinde bazı köprüler ekledim ve önceden tanımlanan stili kullanmak için bu köprüleri kurdum.

pencere (basitleştirilmiş) şöyle görünür:

<Window> 
    ... 
    <ContentControl 
     ... 
     ContentTemplate="{StaticResource myDataTemplate}" /> 
    ... 
</Window> 

veri şablonu (basitleştirilmiş) şuna benzer: çünkü çalışmıyor tarzında OpenHyperlinkCommand bağlanarak

<Window.Resources> 
    ... 
    <DataTemplate x:Key="myDataTemplate DataType="{x:Type my:MyType}"> 
    ... 
    <TextBlock> 
     <Hyperlink 
      Style="{StaticResource hyperlinkStyle}" 
      CommandParameter="{Binding Path=Uri1}"> 
     <TextBlock Text="{Binding Path=Uri1}" /> 
     </Hyperlink> 
    </TextBlock> 
    ... 
    <TextBlock> 
     <Hyperlink 
      Style="{StaticResource hyperlinkStyle}" 
      CommandParameter="{Binding Path=Uri2}"> 
     <TextBlock Text="{Binding Path=Uri2}" /> 
     </Hyperlink> 
    </TextBlock> 
    ... 
    </DataTemplate> 
    ... 
</Window.Resources> 

Bu pencereye bağlı olan ViewModel, bu komutu içerir, ancak DataTemplate, bu komutu içermeyen (ya da içermeyen) MyType nesnelerine bağlıdır.

Bu ciltleme işlemini nasıl yapmalıyım? İki soru:

  1. İşte teklifim: Ben pencere x:Name="myWindow" adında ve bu tarzı iç bağlanma komutu değiştirdi:

    <Setter Property="Command" Value="{Binding ElementName=myWindow Path=DataContext.OpenHyperlinkCommand}" /> 
    

    Bu çalışır, ancak çok kirli görünüyor. Bunu yanlış mı yapıyorum? Daha iyi bir yolu var mı, daha fazla MVVM benzeri? Bu kırılgandır çünkü bir öğenin içinde belirli bir öğe adı ayarlıyorum!

  2. İlk yerindeki bir dizinin içindeki komut bağlarını yazmak iyi bir uygulamadır mı? Yoksa, alternatif nedir? UserControl, bir kompleks geliştirdiysem, mantıksal ağacının derinliklerinde bir yere bileşenlere nasıl komutlar koyabilirim?

Yardımlarınız için teşekkürler!

cevap

16
  1. alternatif sözdizimi bir tarzda Bu benim gündüz yapılan

+0

yazı komut ciltleri ile yanlış bir şey görmüyorum RelativeSource

<Setter Property="Command" Value="{Binding DataContext.OpenHyperlinkCommand, RelativeSource={Relative Source AncestorType={x:Type Window}}}">

  • kullanırsınız .. . Teşekkürler! – danjarvis