मैंने WPF और कमांड्स के साथ एक समस्या में भाग लिया है जो कि एक ItemControl के DataTemplate के अंदर एक बटन से बंधा है। परिदृश्य काफी आगे है। आइटम्सकंट्रोल वस्तुओं की एक सूची से जुड़ा हुआ है, और मैं एक बटन पर क्लिक करके सूची में प्रत्येक वस्तु को हटाने में सक्षम होना चाहता हूं। बटन एक कमांड निष्पादित करता है, और कमांड डिलीट होने का ख्याल रखता है। CommandParameter उस ऑब्जेक्ट के लिए बाध्य है जिसे मैं हटाना चाहता हूं। इस तरह से मुझे पता है कि उपयोगकर्ता ने क्या क्लिक किया। एक उपयोगकर्ता को केवल अपनी "स्वयं" ऑब्जेक्ट को हटाने में सक्षम होना चाहिए - इसलिए मुझे यह सत्यापित करने के लिए कमांड के "CanExecute" कॉल में कुछ जांच करने की आवश्यकता है कि उपयोगकर्ता के पास सही अनुमतियाँ हैं।
समस्या यह है कि CanExecute को दिया गया पैरामीटर NULL है जिसे पहली बार कहा जाता है - इसलिए मैं कमांड को सक्षम / अक्षम करने के लिए तर्क नहीं चला सकता। हालाँकि, अगर मैं इसे सक्षम बनाता हूं, और फिर कमांड को निष्पादित करने के लिए बटन पर क्लिक करें, कमांडपार्टीमीटर सही तरीके से पास किया गया है। तो इसका मतलब है कि CommandParameter के खिलाफ बाध्यकारी काम कर रहा है।
ItemControl और DataTemplate के लिए XAML इस तरह दिखता है:
<ItemsControl
x:Name="commentsList"
ItemsSource="{Binding Path=SharedDataItemPM.Comments}"
Width="Auto" Height="Auto">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button
Content="Delete"
FontSize="10"
Command="{Binding Path=DataContext.DeleteCommentCommand, ElementName=commentsList}"
CommandParameter="{Binding}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
तो जैसा कि आप देख सकते हैं कि मेरे पास टिप्पणियों की सूची है। मैं चाहता हूँ कि DeleteCommentCommand का CommandParameter कमांड ऑब्जेक्ट के लिए बाध्य हो।
इसलिए मुझे लगता है कि मेरा सवाल है: क्या किसी ने पहले इस समस्या का अनुभव किया है? CanExecute को मेरी कमांड पर बुलाया जाता है, लेकिन पैरामीटर हमेशा NULL होता है - ऐसा क्यों है?
अपडेट: मैं समस्या को थोड़ा कम करने में सक्षम था। मैंने एक खाली डीबग ValueConverter जोड़ा ताकि मैं कमांडपैरमीटर डेटा बाउंड होने पर संदेश को आउटपुट कर सकूं। समस्या यह है कि CommandParameter बटन पर बँधने से पहले CanExecute पद्धति निष्पादित हो जाती है। मैंने कमांडपार्टीमीटर को कमांड से पहले सेट करने की कोशिश की है (जैसा कि सुझाव दिया गया है) - लेकिन यह अभी भी काम नहीं करता है। इसे कैसे नियंत्रित किया जाए, इस पर कोई सुझाव।
अपडेट 2: क्या बंधन "किए जाने" का पता लगाने का कोई तरीका है, ताकि मैं कमांड के पुनर्मूल्यांकन को मजबूर कर सकूं? इसके अलावा - क्या यह एक समस्या है कि मेरे पास कई बटन हैं (प्रत्येक आइटम के लिए आइटमकंट्रोल में) जो कमांड-ऑब्जेक्ट के एक ही उदाहरण के लिए बाध्य हैं?
अपडेट 3: मैंने अपने स्काईड्राइव को बग का प्रजनन अपलोड किया है: http://cid-1a08c11c407c0d8e.skydrive.live.com/self.aspx/Code%20samples/CommandParameterBinding.zip