2011-10-05 15 views
15

नीचे की तरह एक कोड मान लिया जाये कि, मेरे SomeCustomControl मेंकस्टम नियंत्रण में बाइंडेबल कमांड कैसे बनाएं?

public class SomeViewModel{ 
     ICommand ReloadCommand{get...} 
     ICommand SaveCommand{get..} 
} 

//SomeView.xaml 
<SomeCustomControl Reload="ReloadCommand" Save="SaveCommand" /> //NOT SURE HOW?? 

//SomeCustomContro.xaml 
<SomeCustomControl x:Name="someCustomControl"> 
<Button Command={Binding ElementName=someCustomControl, Path=Reload /> 
<Button Command={Binding ElementName=someCustomControl, Path=Save /> 
</SomeCustomControl> 

//SomeCustomControl.xaml.cs 
..... //NOT SURE HOW TO ALLOW BINDING TO A ICOMMAND ?? 

, मैं "XAML में ICommand के बंधन" का समर्थन करने की जरूरत है। मैं समझता हूं कि निर्भरताप्रॉपर्टी इस तरह बांध सकते हैं, लेकिन इस मामले में मुझे आईसीओएमएंड बांधना होगा।

क्या कोई सुझाव दे सकता है कि ऐसा करने का सबसे अच्छा तरीका क्या है? कोई सुझाई गई सामग्री या लिंक का उपयोग किया जाएगा क्योंकि मुझे एक दिशा याद आ रही है।

संपादित करें 1) मैं कुछCustomControl में DataContext SomeView का उपयोग कर सकता हूं। उन दोनों के बीच अधिक तर्क और अलगाव है जो मैं भंग नहीं कर सकता। मुझे अपने कुछ कस्टम कंट्रोल में कहीं भी रीलोड/आईसीओएमंड्स को सहेजने का संदर्भ बनाए रखना चाहिए।

बहुत बहुत धन्यवाद।

उत्तर

31

मुझे आपको सीधे प्राप्त करने दें, आप Reload और Save से बाध्य करना चाहते हैं?

ताकि बनाने, और घोषणा की और दो निर्भरता गुण ReloadCommandProperty और SomeCustomControl के लिए प्रकार ICommand की SaveCommandProperty को परिभाषित करने की जरूरत है।

तो यह सोचते हैं कि SomeCustomControlControl से निकला है ...

public class SomeCustomControl : Control 
{ 
    public static DependencyProperty ReloadCommandProperty 
     = DependencyProperty.Register(
      "ReloadCommand", 
      typeof (ICommand), 
      typeof (SomeCustomControl)); 

    public static DependencyProperty SaveCommandProperty 
     = DependencyProperty.Register(
      "SaveCommand", 
      typeof(ICommand), 
      typeof(SomeCustomControl)); 

    public ICommand ReloadCommand 
    { 
     get 
     { 
      return (ICommand)GetValue(ReloadCommandProperty); 
     } 

     set 
     { 
      SetValue(ReloadCommandProperty, value); 
     } 
    } 

    public ICommand SaveCommand 
    { 
     get 
     { 
      return (ICommand)GetValue(SaveCommandProperty); 
     } 

     set 
     { 
      SetValue(SaveCommandProperty, value); 
     } 
    } 
} 

को RelodCommand और SaveCommand गुण इस उचित बाध्यकारी काम शुरू होगा करने के बाद ...

 <SomeCustomControl RelodCommand="{Binding ViewModelReloadCommand}" 
         SaveCommand="{Binding ViewModelSaveCommand}" /> 
2

ऐसी संपत्ति बनाएं जो आपके आदेश को वापस कर देगी और जहां भी आवश्यकता हो, इस संपत्ति को बांध दे।

private ICommand _reloadCommand; 
public ICommand ReloadCommand 
{ 
    get 
    { 
    if(_reloadCommand == null) _reloadCommand = CreateReloadCommand(); 
    return _reloadCommand; 
    } 
} 

बदलें

<Button Command={Binding ReloadCommand}" /> 

करने के लिए अपने कोड में बाध्यकारी और वह आदेशों में शामिल है दृश्य मॉडल करने के लिए कस्टम नियंत्रण DataContext बाँध।

+0

तुम्हारा मतलब है कि मैं सीधे एक बाध्य कर सकते हैं एक नियंत्रण में एक संपत्ति के लिए ICommand उदाहरण ?? इसके अलावा, "CreateReloadCommand" के लिए क्या है? यह कमांड उदाहरण ViewModel में बनाया जाएगा, और कुछ कस्टम कंट्रोल को केवल उस इंस्टेंस संदर्भ को स्टोर करने की आवश्यकता है (xaml बाइंडिंग का उपयोग करके)। –

+0

आप जो भी चाहें आईसीओएमएंड प्रकार के मूल्य को बाध्य कर सकते हैं, बाध्यकारी के लिए सबसे सार्थक निर्भरता संपत्ति 'ButtonBase.CommandProperty' है। 'CreateReloadCommand' आपके आदेश को बनाने का एक तरीका है - मैं कमांड निर्माण और प्रारंभिक कोड लिखना नहीं चाहता था। जब मैं अपना उत्तर टाइप कर रहा था, तो आपके कोड में कमांड के लिए विधियां हैं (आपने उन्हें बाद में बदल दिया है)। –

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