मेरे पास एक कमांड के साथ व्यूमोडेल से जुड़े बटन के साथ एक सरल-जैसी खिड़की हो सकती है।आदेश अक्षम नहीं होता है जब आदेश CanExecute गलत है
मुझे उम्मीद है कि बटन को अक्षम करने की उम्मीद है यदि MyCommand.CanExecute() गलत है। लेकिन ऐसा लगता है कि जब पहली बार खिड़की खींची जाती है तो WPF केवल IsEnabled गुण सेट करेगा। कोई भी आगामी कार्रवाई बटन की दृश्य स्थिति को प्रभावित नहीं करती है। मैं प्रिज्म से एक प्रतिनिधिमंडल का उपयोग कर रहा हूँ।
मेरे दृश्य:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Content="Click Here" Command="{Binding MyCommand}" Width="100" Height="50"/>
</Grid>
और मेरे ViewModel: समय की
public class MyVM : NotificationObject
{
public MyVM()
{
_myCommand = new DelegateCommand(DoStuff, CanDoStuff);
}
private void DoStuff()
{
Console.WriteLine("Command Executed");
_myCommand.RaiseCanExecuteChanged();
}
private bool CanDoStuff()
{
var result = DateTime.Now.Second % 2 == 0;
Console.WriteLine("CanExecute is {0}", result);
return result;
}
private DelegateCommand _myCommand;
public ICommand MyCommand
{
get
{
return _myCommand;
}
}
}
50%, जब मेरे आवेदन लोड, बटन ठीक से अक्षम है। हालांकि, यदि विंडो लोड होने पर यह सक्षम होता है, और मैं कमांड निष्पादित करने के लिए बटन क्लिक करता हूं, तो मुझे बटन के अक्षम होने के 50% समय की उम्मीद है, लेकिन यह कभी नहीं करता है। आदेश निष्पादित नहीं होता है, लेकिन मैं अभी भी बटन पर क्लिक कर सकता हूं। मैं समझने के लिए WPF कैसे प्राप्त करूं कि CanExecute() गलत होने पर बटन अक्षम होना चाहिए?
पहली बात तुम क्या करने की जरूरत है डेटा बाइंडिंग के लिए डीबग संदेश बारी है: http://i.stack.imgur.com/MF8i5.png इसके बाद, आउटपुट विंडो को दोबारा चलाएं और जांचें और देखें कि क्या त्रुटियां हैं। यदि कोई भी आपके आदेश बाध्यकारी से संबंधित नहीं है, तो 'RaiseCanExecuteChanged()' का आपका कार्यान्वयन गलत/छोटी है। – Will
आपकी CanDOStuff विधि वास्तव में अजीब है! यह आपके बटन को अक्षम कर सकता है, लेकिन अगले सेकंड में आपका आदेश निष्पादित हो सकता है, लेकिन बटन अक्षम है ... वास्तव में wierd। लेकिन आपको [CommandManager.InvalidateRequerySuggested()] (http://msdn.microsoft.com/en-us/library/system.windows.input.commandmanager.invalidaterequerysuggested.aspx) कॉल करना चाहिए यदि आपका CanExecute बदला जा सकता है और UI नहीं है अपडेट किया गया क्योंकि CanExecuteChanged नहीं उठाया गया था। –
@ विकटर मुझे पता है कि यह वास्तव में अजीब है, यह एक मूर्ख उदाहरण होना चाहिए जो यादृच्छिक रूप से सच/गलत लौटाता है। CommandManager.InvalidateRequery सुझाया गया कोई प्रभाव नहीं है। –