【问题标题】:Caliburn command evaluation only fired onceCaliburn 命令评估只触发一次
【发布时间】:2015-10-15 00:31:54
【问题描述】:

我正在尝试使用 Caliburns 'Can' 约定在我的视图上启用一个按钮以进行视图模型属性评估。

查看(摘录)

<PasswordBox PasswordChanged="PasswordBox_OnPasswordChanged" Grid.Row="1" Grid.Column="1" />
...
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
    <Button Content="Cancel" cal:Message.Attach="[Event Click] = [Action Cancel]" />
    <Button Content="Login" cal:Message.Attach="[Event Click] = [Action Login]" />
</StackPanel>

代码隐藏

private void PasswordBox_OnPasswordChanged(object sender, RoutedEventArgs e)
{
    if (DataContext != null)
        ((dynamic) DataContext).Password = ((PasswordBox) sender).Password;
}

视图模型

public class LoginSplashViewModel : Screen
{

    private string _username;
    private string _password;

    public string Username
    {
        get { return _username; }
        set
        {
            _username = value;
            NotifyOfPropertyChange();
        }
    }

    public string Password
    {
        get { return _password; }
        set
        {
            _password = value;
            NotifyOfPropertyChange();
        }
    }

    public LoginSplashViewModel()
    {
        DisplayName = "Login";
    }

    public bool CanLogin()
    {
        return  !string.IsNullOrEmpty(_username) || 
                !string.IsNullOrEmpty(_password);
    }

    public void Login()
    {
        TryClose(true);
    }

    public void Cancel()
    {
        TryClose(false);
    }

}

但是'CanLogin()' 方法只被触发一次(当将视图模型绑定到视图时),并且永远不会再次触发,因此按钮保持禁用状态。

我错过了什么吗?

【问题讨论】:

    标签: c# .net wpf mvvm caliburn.micro


    【解决方案1】:
     public string Password{
      get{ return _password;}
      set{
         _password = value;
         NotifyOfPropertyChange();
         NotifyOfPropertyChange(() => CanLogin);   // <--- Addition
       }
     } 
    

    对于用户名也是如此......

    对于它的价值,您也不必参加冗长的活动...... 你可以这样做
    &lt;Button x:Name="Login" /&gt;

    【讨论】:

      【解决方案2】:

      这是在 Caliburn 中执行命令的方式。基本上有一个东西可以调用force reevaluation of CanExecute methods in ICommand implementors

      只要有可以在代码背后或 viewModel 中识别的更改。此外,您可以选择自己实施命令并避免这种必要性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-25
        • 2021-06-07
        • 1970-01-01
        • 2013-05-21
        • 2011-03-25
        相关资源
        最近更新 更多