【问题标题】:WPF Binding ICommand with ViewModelWPF 将 ICommand 与 ViewModel 绑定
【发布时间】:2015-11-13 01:30:38
【问题描述】:

ICommand:

public class CMDAddEditUser : ICommand
{
    public event EventHandler CanExecuteChanged;
    public VMAddEditUser ViewModel { get; set;}

    public CMDAddEditUser()
    {
    }

    public CMDAddEditUser(VMAddEditUser vm)
    {
        ViewModel = vm;
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }


    public void Execute(object parameter)
    {
        this.ViewModel.SimpleMethod();
    }
}

视图模型:

public class VMAddEditUser
{
    private Employee _employee = new Employee();
    private CMDAddEditUser Command { get; set; }

    public VMAddEditUser()
    {
        Command = new CMDAddEditUser(this);
    }

    public string txtFirstName
    {
        get { return _employee.FirstName; }
        set { _employee.FirstName = value; }
    }

    public void SimpleMethod()
    {
        txtFirstName = "abc";
    }
}

XAML:

<Window x:Class="WPF.AddEditUserView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="clr-namespace:ViewModel;assembly=ViewModel"
        Title="AddEditUserView" Height="392.329" Width="534.143">
    <Grid Margin="0,0,2,-3">
        <Grid.Resources>
            <vm:VMAddEditUser x:Key="abx"/>
        </Grid.Resources>
        <Grid.DataContext>
            <vm:VMAddEditUser/>
        </Grid.DataContext>
        <Button x:Name="btn" Content="Cancel" Command="{Binding SimpleMethod, Source={StaticResource abx}}"/>

    </Grid>
</Window>

CMDAddEditUser 和 VMAddEditUser 在同一个项目中,而 xaml 在不同的项目中。

ICommand 的.Execute(Object Parameter) 似乎不起作用。我无法将 SimpleMethod 与我拥有的按钮绑定。当我在 xaml 文件中键入命令绑定时,自动完成/建议仅显示 txtFirstName 而不是 SimpleMethod。我想不通为什么 SimpleMethod 不能绑定也找不到。我在这段代码中做错了什么?

【问题讨论】:

  • SimpleMethod 不是命令。那是您的 Command 属性。它应该是公开的,并且绑定应该是Command="{Binding Command, ...}"
  • 您的 Icommand 属性是私有的。将其公开并与之绑定。

标签: c# wpf mvvm binding icommand


【解决方案1】:

首先:您希望视图能够绑定到的所有属性都必须是公共的。由于视图绑定到属性,这是ICommand 实现的实例,属性必须是公共的,所以视图可以访问它。但是,如果您不想将 SimpleMethod() 暴露给外界,您的 SimpleMethod() 可以是私有的,这就是为什么您有命令调用它而不是让 view 直接调用它的原因。 第二:您将网格DataContext 设置为您的“VMEditUser”类,因此在绑定中无需指定SourceDataContext 是源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 2015-04-02
    • 2012-06-11
    • 2018-09-05
    • 2011-09-28
    • 2012-06-11
    • 1970-01-01
    相关资源
    最近更新 更多