2011-04-12 22 views
6

यहां मेरी स्थिति का बहुत तेज़ और सरलीकृत स्पष्टीकरण है। मैं Hyperlink नियंत्रण के लिए एक शैली को परिभाषित किया है और वे Command संपत्ति आदेश एक ViewModel वर्ग (सरलीकृत) में परिभाषित से आबद्ध है:डब्ल्यूपीएफ: शैलियों और/या डेटा टेम्पलेट्स (एमवीवीएम) में बाध्यकारी आदेश?

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

इसके बाद, मैं खिड़की मैं डिजाइनिंग हूँ में एक सामग्री नियंत्रण बनाया। इसमें खिड़की संसाधनों में लिखे गए डेटा टेम्पलेट को परिभाषित किया गया है। उस डेटा टेम्पलेट के अंदर, मैंने कुछ हाइपरलिंक जोड़े और मैंने उन हाइपरलिंक्स को पहले परिभाषित शैली का उपयोग करने के लिए सेट किया।

खिड़की इस तरह दिखता है (सरलीकृत):

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

डेटा टेम्पलेट इस तरह दिखता है (सरलीकृत):

<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> 

शैली क्योंकि काम नहीं करता है में OpenHyperlinkCommand के लिए बाध्य विंडो में से ViewModel में यह आदेश शामिल है, लेकिन DataTemplateMyType ऑब्जेक्ट्स से जुड़ा हुआ है, जिसमें यह आदेश नहीं है (न ही चाहिए)।

मुझे यह बाध्यकारी काम कैसे करना चाहिए? दो सवाल:

  1. यहाँ मेरा प्रस्ताव है: मैं अपनी खिड़की x:Name="myWindow" नाम है, और यह करने के लिए शैली के अंदर आदेश के बंधन बदल दिया है:

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

    यह काम करता है, लेकिन यह इतना गंदा लग रहा है। क्या मैं यह गलत कर रहा हूँ? क्या कोई बेहतर तरीका है, एमवीवीएम जैसी? यह नाजुक है क्योंकि मैं शैली के अंदर विशिष्ट तत्व नाम सेट कर रहा हूं!

  2. क्या यह पहले स्थान पर शैली के अंदर कमांड बाइंडिंग लिखना अच्छा अभ्यास है? यदि नहीं, तो विकल्प क्या है? क्या होगा यदि मैंने जटिल UserControl, विकसित किया है, तो मैं अपने लॉजिकल पेड़ के अंदर कहीं गहराई से घटकों को कैसे सेट करूं?

सभी मदद के लिए धन्यवाद!

उत्तर

16
  1. एक वैकल्पिक वाक्य रचना RelativeSource

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

  2. का उपयोग मैं एक शैली

+0

यह सिर्फ मेरा दिन बना दिया में कुछ भी लिखने आदेश बाइंडिंग के साथ गलत नहीं दिख रहा होगा .. । धन्यवाद! – danjarvis

संबंधित मुद्दे