我知道我在使用RaiseCanExecuteChanged和CanExecute做错了

时间:2012-09-04 03:33:54

标签: wpf mvvm command canexecute

在摆弄MVVM灯后,让我的按钮在我想要的时候启用和禁用......我把它们混合在一起直到它起作用。

然而,我只是知道我在这里做错了什么。我在被调用的同一区域有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();
    }
}

1 个答案:

答案 0 :(得分:0)

CanExecute方法仅返回命令是否可以执行。它没有做任何其他事情。您只需要RaiseCanExecuteChangedRaiseCanExecuteChanged会在您的情况下致电CanHostChat