2012-09-04 40 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

相关问题