【问题标题】:Utilizing ICommand in WPF -- Command returning null在 WPF 中使用 ICommand -- 返回 null 的命令
【发布时间】:2013-04-16 02:33:02
【问题描述】:

我正在处理 WPF 中的示例 ViewModel,我目前正在将视图中的 3 个文本框绑定到 IdFirstNameLastName。然后,我在 xaml.cs 文件中有一个按钮单击事件,该事件执行更新示例数据库表的方法。我正试图围绕 MVVM 和 WPF。我想取消按钮单击事件并改为绑定到命令。我正在使用 Linq to Sql 进行数据库连接。

当我调试代码时,一切都返回 null。我走对了吗?

谢谢!

这是虚拟机的一部分(我不想发布所有代码。)

public class People
{
    public Guid Id {get; set;}
    public string FirstName {get; set;}
    public string LastName {get; set;}
}

private People mPeople = null;
private Guid mId = Guid.empty;

public People people
{
    get {return mPeople;}
    set {mPeople = value; OnPropertyChanged("people");}
}


public overide void Refresh()    
{      
    Using (DatabaseDataContext dc = new DatabaseDataContext())      
    {
        mId = CurrentUser.Identity;

        var query = from person in dc.PeopleTables 
            where person.PId = mId
            select new People()
            {
                Id = person.PId,
                    FirstName = person.FirstName,
                LastName = person.LastName
            };

        mPeople = query.First();
    }
}

在虚拟机中,我正在尝试使用命令

private RelayCommand mUserUpdate = null;

public ICommand UserUpdate
{
    get
    {
        if(mUserUpdate == null) mUserUpdate = new RelayCommand(p => UpdateUser(p));
        return mUserUpdate;
    }
}

private void UpdateUser(object parameter)
{
    People pe = parameter as People;
    UpdateUser(pe.Id, pe.FirstName, pe.LastName);
}

public static void UpdateUser(Guid Id, string FirstName, string LastName)
{
    DatabaseDataContext DC = new DatabaseDatacontext();

    var User = (from c in DC.GetTable<PeopleTable>()
                where c.PId = mId
            select c).SingleOrDefault();

    if (User == null
    {
        //Do my inserts here 
    }
    else
    {
        try
        {
            User.Id = Id;
        User.FirstName = FirstName;
        User.LastName = LastName;

        DC.SubmitChanges();
        }
        catch
        {
            throw ex;
        }
    }
}

这是我使用的点击事件

private void btnSave_Click(object sender, RoutedEventArgs e)
{
    UserViewModel.UpdateUser(txtId.Text, txtFirstName.Text, txtLastName.Text);
}

是的,我把点击事件去掉了,换成了

<Button Command="{Binding Path=UserUpdate}"/>

我正在像这样绑定文本框

<TextBox Width="250" Text="{Binding Path=Id}"/> 
</StackPanel> 
<StackPanel Orientation="Horizontal" Margin="0,5,0,0"> 
<Label Content="First Name:" Margin="0,0,4,0"/> 
<TextBox Width="250" Text="{Binding Path=FirstName}"/> 
</StackPanel> 
<StackPanel Orientation="Horizontal" Margin="0,5,0,0"> 
<Label Content="Last Name:" Margin="35,0,4,0"/> 
<TextBox Width="250" Text="{Binding Path=LastName}"/>

【问题讨论】:

  • 我们可以查看您的 xaml 代码吗?特别是在按钮上设置 Command 属性的部分。

标签: c# wpf mvvm icommand


【解决方案1】:

命令用于replace 按钮的Click 事件处理程序。

您应该删除事件处理程序并执行

<Button Command="{Binding UserUpdate}"/>

【讨论】:

    【解决方案2】:

    您可能需要设置命令参数:

    <Button Command="{Binding UserUpdate}" CommandParameter="{Binding SelectedUser}"/>
    

    如果“SelectedUser”来自您的 VM 而不是当前 UI,则您不需要该参数。只需获取要在 VM 中修改的用户实例的引用即可。

    【讨论】:

      【解决方案3】:

      就目前而言,您的代码无法正常工作,因为您希望将 Person 类型的参数传递给不可能的命令(我认为)。

      您的视图模型需要如下所示:

      public class PersonViewModel : *INotifyPropertyChanged base class here*
      {
          public PersonViewModel()
          {
              UpdatePersonCommand = new RelayCommand(UpdateUser);
          }
      
          public Guid Id {get{ return _id;} { set _id = Id; RaisePropertyChanged("Id"); }
          public string FirstName { ... same }
          public string LastName { ... same }
      
          public ICommand UpdatePersonCommand {get; private set;}
      
          private void UpdateUser()
          {
              UpdateUser(Id, FirstName, LastName);
          }
      
          private void UpdateUser(Guid Id, string FirstName, string LastName)
          {
              DatabaseDataContext DC = new DatabaseDatacontext();
              ...
          }
      
      }
      

      【讨论】:

        【解决方案4】:

        在 UpdateUser 方法中试试这个

        Private void UpdateUser(object obj)
        {
            UpdateUser(Id, FirstName, LastName);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-06-10
          • 1970-01-01
          • 2021-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多