2012-09-14 10 views
36

मेरे पास एक दृश्य है AttributeView जिसमें सभी प्रकार के गुण शामिल हैं। एक बटन भी है जो दबाए जाने पर, इसे डिफ़ॉल्ट मानों को गुणों में सेट करना चाहिए। मेरे पास ViewModelBase क्लास भी है जो मेरे पास सभी व्यू मॉडल्स के लिए बेस क्लास है। समस्या यह है कि मैं WPF के साथ कमांड के बटन को बाध्य नहीं कर पा रहा हूं।ViewModelBase में कमांड पर WPF बटन को कैसे बाध्य करें?

मैं इस की कोशिश की है, लेकिन यह सिर्फ कुछ नहीं करता:

<Button Command="{Binding DataInitialization}" Content="{x:Static localProperties:Resources.BtnReinitializeData}"></Button> 

आदेश परिभाषित किया गया है (ViewModelBase में) इस तरह:

public CommandBase DataInitialization { get; protected set; } 

और पर आवेदन स्टार्टअप एक नया उदाहरण आदेश के लिए बनाई गई है:

DataInitialization = new DataInitializationCommand() 

हालांकि, WPF बाध्यकारी टी "लगता है" प्रतीत नहीं होता है वह आदेश (बटन दबाकर कुछ भी नहीं करता है)। वर्तमान दृश्य में उपयोग किया गया व्यूमोडेल ViewModelBase से लिया गया है। मैं और क्या कोशिश कर सकता हूं (मैं डब्ल्यूपीएफ के लिए काफी नया हूं इसलिए यह एक बहुत ही सरल सवाल हो सकता है)?

+0

क्या कमांडबेस आईसीओएमएंड से विरासत में आता है? क्या बटन DataContext में DataInitialization कमांड है? क्या आपके पास बाध्यकारी के बारे में आउटपुट पैनल में कोई संदेश है? –

+0

हां इसे आईसीओएमएंड विरासत में मिला है। मैं बटन के डेटाकॉन्टेक्स्ट को कैसे देखूं? मैं आउटपुट में संदेशों के बारे में निश्चित नहीं हूं (डिफ़ॉल्ट रूप से कोई होना चाहिए?)। –

+0

यदि आप व्यूमोडेल और xaml –

उत्तर

88
<Grid > 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Button Command="{Binding ClickCommand}" Width="100" Height="100" Content="wefwfwef"/> 
</Grid> 

खिड़की के लिए पीछे कोड:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new ViewModelBase(); 
    } 
} 

और ViewModel:

public class ViewModelBase 
{ 
    public ViewModelBase() 
    { 
     _canExecute = true; 
    } 
    private ICommand _clickCommand; 
    public ICommand ClickCommand 
    { 
     get 
     { 
      return _clickCommand ?? (_clickCommand = new CommandHandler(() => MyAction(), _canExecute)); 
     } 
    } 
    private bool _canExecute; 
    public void MyAction() 
    { 

    } 
} 
public class CommandHandler : ICommand 
{ 
    private Action _action; 
    private bool _canExecute; 
    public CommandHandler(Action action, bool canExecute) 
    { 
     _action = action; 
     _canExecute = canExecute; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return _canExecute; 
    } 

    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
     _action(); 
    } 
} 

मुझे आशा है कि यह आप विचार दे देंगे।

+0

इसने मुझे एक सुराग दिया जहां खोजना है। यह पता चला कि आदेश कई स्थानों पर शुरू किया गया था और इन स्थानों में से एक (सही एक) टिप्पणी की गई थी :) धन्यवाद! –

+0

@kor_: यही कारण है कि हमने अधिक कोड –

+6

पूछा हाँ हां यह कई लुकअप के बाद पाया गया सबसे अच्छा स्पष्टीकरण है। धन्यवाद @Ethicallogics –

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