2012-09-04 41 views
0

在擺弄MVVM指示燈以讓我的按鈕啓用和禁用時,我希望它可以......我把各種東西混合在一起,直到它工作。我知道我在做錯RaiseCanExecuteChanged和CanExecute錯誤

但是,我只知道我在這裏做錯了什麼。我有RaiseCanExecuteChanged和CanExecute在被調用的同一區域。當然,這不是如何完成的?

這裏是我的XAML

<Button Margin="10, 25, 10, 25" VerticalAlignment="Center" HorizontalAlignment="Center" Width="50" Height="50" Grid.Column="1" Grid.Row="3" Content="Host"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Click"> 
      <mvvmLight:EventToCommand Command="{Binding HostChat}" MustToggleIsEnabled="True" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</Button> 

這裏是我的代碼

public override void InitializeViewAndViewModel() 
{ 
    view = UnityContainer.Resolve<LoginPromptView>(); 
    viewModel = UnityContainer.Resolve<LoginPromptViewModel>(); 
    view.DataContext = viewModel; 
    InjectViewIntoRegion(RegionNames.PopUpRegion, view, true); 

    viewModel.HostChat = new DelegateCommand(ExecuteHostChat, CanHostChat); 
    viewModel.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(ViewModelPropertyChanged); 
} 

void ViewModelPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "Name" || e.PropertyName == "Port" || e.PropertyName == "Address") 
    { 
     (viewModel.HostChat as DelegateCommand).RaiseCanExecuteChanged(); 
     (viewModel.HostChat as DelegateCommand).CanExecute(); 
    } 
} 

public void ExecuteHostChat() 
{ 
} 

public bool CanHostChat() 
{ 
    if (String.IsNullOrEmpty(viewModel.Address) || 
     String.IsNullOrEmpty(viewModel.Port) || 
     String.IsNullOrEmpty(viewModel.Name)) 
    { 
     return false; 
    } 
    else 
     return true; 
} 

看到這兩個怎麼在一起的?當然,這不可能是正確的。我的意思是...對我來說很有效...但是有些事情似乎錯了。不應該RaiseCanExecuteChanged調用CanExecute?它不......所以如果我沒有那個CanExecute在那裏,我的控件就不會象我需要的那樣切換它的IsEnabled。

(viewModel.HostChat as DelegateCommand).RaiseCanExecuteChanged(); 
(viewModel.HostChat as DelegateCommand).CanExecute(); 

編輯:

如果我最終使用按鈕的Command屬性綁定我的命令......一切工作正常。我可以刪除CanExecute,只留下RaiseCanExecuteChanged,一切都很好。

像這樣...這工作得很好。

<Button Command="{Binding HostChat}" Margin="10, 25, 10, 25" VerticalAlignment="Center" HorizontalAlignment="Center" Width="50" Height="50" Grid.Column="1" Grid.Row="3" Content="Host"> 
</Button> 

void ViewModelPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "Name" || e.PropertyName == "Port" || e.PropertyName == "Address") 
    { 
     (viewModel.HostChat as DelegateCommand).RaiseCanExecuteChanged(); 
     //(viewModel.HostChat as DelegateCommand).CanExecute(); 
     //CommandManager.InvalidateRequerySuggested(); 
    } 
} 
+0

經進一步思考,它甚至沒有正常工作。它啓用按鈕...但是它不會禁用它。 – Cowman

+0

如果我使用MVVM light的RelayCommand而不是DelegateCommand ...事情似乎正常工作。 難道這真的是問題的根源嗎?如果是這樣,那看起來很愚蠢。 – Cowman

回答

0

CanExecute方法只返回是否可以執行該命令。它什麼都不做。你只需要RaiseCanExecuteChangedRaiseCanExecuteChanged將在您的情況下致電CanHostChat

+0

但是,如果我將MVVM Light EventToCommand與Microsoft Prism DelegateCommand一起使用,它似乎並沒有調用它。它只有在我用MVVM Light的RelayCommand更換DelegateCommand時纔有效。我在代碼中找不到任何會導致這種情況的內容,但是果然如此。 任何想法爲什麼? – Cowman

+0

我從來沒有使用過EventToCommand。也許你必須使用RelayCommand。但看起來像一個錯誤...它應該工作。 – Vale

相關問題