2013-06-07 4 views
7

के भीतर बाध्य नहीं कर सकता मैं एक साधारण एमवीवीएम प्रोजेक्ट चला रहा हूं और पहली बाधा पर गिर गया। मैं जोश स्मिथस रिले कमांड दृष्टिकोण का उपयोग कर अपने आदेशों को बाध्य कर रहा हूं।संसाधन शब्दकोश

समस्या यह है कि जब बटन संसाधन डिक्शनरी में होता है तो बटन बाध्यकारी नहीं होता है। अगर मैं अपने मुख्य Window.xaml में कोड (बिल्कुल जैसा है) ले जाता हूं तो कोड वांछित के रूप में निष्पादित करता है।

यह मेरा MainWindow.xaml

<Window x:Class="ForJon.Views.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:vm="clr-namespace:ForJon.Ui.ViewModels" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 

    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="160" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 

    <Grid.Resources> 
     <ResourceDictionary Source="Resources\ResourceDictionary.xaml" /> 
    </Grid.Resources> 

    <Grid.DataContext> 
     <vm:MainWindowViewModel /> 
    </Grid.DataContext> 

    <HeaderedContentControl 
     Header="Options" 
     Style="{StaticResource LeftMenu}" 
     Grid.Column="0" 
     /> 

    </Grid> 
</Window> 

और संसाधन शब्दकोश है

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:view="clr-namespace:ForJon.Ui.Views" 
        xmlns:viewModel="clr-namespace:ForJon.Ui.ViewModels" 
        > 

    <Style x:Key="LeftMenu" TargetType="HeaderedContentControl"> 
     <Setter Property="HeaderTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
         <StackPanel> 
          <Button Content="Add" Command="{Binding AddCommand}" /> 
         </StackPanel> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="Width" Value="160"/> 
    </Style> 

</ResourceDictionary> 

मैं केवल यह मान सकते हैं कि जब ResourceDictionary में बाध्यकारी है कि यह ViewModel नहीं मिल सकता है (हालांकि मैं डॉन मुझे नहीं पता कि मैं ऐसा क्यों सोचता हूं)। मुझे लगता है कि यह एक अतिरिक्त स्तर को बांधने की कोशिश कर रहा है ...

कोई भी तरीका, क्या कोई यह समझा सकता है कि यह संसाधन शब्दकोश के भीतर से क्यों निष्पादित नहीं कर रहा है।

उत्तर

8

यह समस्या आप Style कॉपी करते हैं ज्यादा DataTemplate

को माता-पिता DataContext पास होने से ResourceDictionary से कोई लेना देना नहीं है और यह Grid.Resources में डाल दिया और टिप्पणी संसाधन शब्दकोश समान व्यवहार हो सकता है लगता है देखा। इसके अलावा बाध्यकारी त्रुटियों को चालू करने से दिखाना चाहिए

System.Windows.Data Error: 40 : BindingExpression path error: 'AddCommand' property not found on 'object' ''String' 

फिक्स है काफी के माध्यम से DataContext मिलता है।

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Style x:Key="LeftMenu" 
     TargetType="HeaderedContentControl"> 
    <Setter Property="HeaderTemplate"> 
     <Setter.Value> 
     <DataTemplate> 
      <StackPanel DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type HeaderedContentControl}}, Path=DataContext}"> 
      <Button Command="{Binding AddCommand}" 
        Content="Add" /> 
      </StackPanel> 
     </DataTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Width" 
      Value="160" /> 
    </Style> 
</ResourceDictionary> 

एक ही मुद्दा ContentTemplate पर लागू होता है, लेकिन Template ठीक काम करता है (यह का उपयोग करता है एक ControlTemplate)

<Setter Property="Template"> 
    <Setter.Value> 
    <ControlTemplate TargetType="{x:Type HeaderedContentControl}"> 
     <StackPanel> 
     <Button Command="{Binding AddCommand}" 
       Content="Add" /> 
     </StackPanel> 
    </ControlTemplate> 
    </Setter.Value> 
</Setter> 
+1

यह समस्या हल करती है लेकिन निश्चित रूप से वहाँ मैं क्या किया है की तुलना में एक अधिक सुरुचिपूर्ण दृष्टिकोण होना चाहिए? क्या इसके बजाय संसाधन शब्दकोश में DataContext घोषित करना बेहतर होगा? धन्यवाद! – Dave

+4

@ डेवरूक एक रिलेटिवसोर्स बाइंडिंग के माध्यम से डेटा कॉन्टेक्स्ट प्राप्त करना बिल्कुल बुरा नहीं है जब आप जानते हैं कि आपका क्या कर रहा है। हालांकि अगर आप मेरी व्यक्तिगत राय मांगते हैं तो मैं भी नहीं करूँगा। संसाधन शब्दकोश का अवधारणा हमारे लिए नियंत्रण का पुन: उपयोग करने के लिए है, लेकिन जब हमारे पास संसाधन शब्दकोश में बाध्यकारी है, तो आपने मूल रूप से 'स्टाइल' को एक बहुत ही विशिष्ट वीएम और व्यू से बांध दिया है जिसका अर्थ है कि आप आइटम में इसे परिभाषित करने से बेहतर हो सकते हैं सीधे। – Viv

+0

वाह, विव, धन्यवाद। इसके लिए मुझ पर बीयर। हां, मैं देख सकता हूं कि आप यह दृष्टिकोण क्यों लेंगे, यह वास्तव में उत्कृष्ट और भारी सहायता है। – Dave

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