0

我想更改ViewModel属性的值(与 绑定DataContext)。使用经典事件非常容易,使用命令它成为艰巨的任务。这是我的代码:

公共部分类 MainWindow : 窗口
    {
        ViewModel _vm = new ViewModel();
        公共主窗口()
        {
            初始化组件();

            _vm.BtnClick = new BtnClick();

            数据上下文 = _vm;
        }
    }

公共类 BtnClick : ICommand
    {
        公共事件 EventHandler CanExecuteChanged
        {
            添加 { CommandManager.RequerySuggested += 值;}
            删除 { CommandManager.RequerySuggested -= 值;}
        }

        public bool CanExecute(对象参数)
        {
            返回真;
        }

        公共无效执行(对象参数)
        {
            Debug.WriteLine(parameter.ToString());
        }
    }

公共类视图模型
    {
        公共 ICommand BtnClick { 获取;放; }
        公共字符串输入{获取;放; }
        公共字符串输出{获取;放; }
    }
<StackPanel>
        <TextBox Text="{Binding Input}"></TextBox>
        <TextBlock Text="{Binding Output}"></TextBlock>
        <Button Command="{Binding Path=BtnClick}" CommandParameter="{Binding Input}">Translate</Button>
    </StackPanel>

命令正确地取值TextBox,现在我想用这个值做事并将其保存到Output. 问题是从命令的角度来看,我无法同时访问DataContextViewModel

4

1 回答 1

0

任何命令的实现通常都在视图模型中。

通常使用框架或助手类。

例如:

https://riptutorial.com/mvvm-light/example/32335/relaycommand

公共类 MyViewModel { .....

public ICommand MyCommand => new RelayCommand(
   () =>
  {
    //execute action
    Message = "clicked Button";
  },
  () =>
  {
    //return true if button should be enabled or not
    return true;
  }

);

在这里,有一个带有“单击按钮”的匿名方法。

这将捕获父视图模型中的变量。

因此,您可以在视图模型中设置一个公共属性,该属性绑定到视图中的文本属性。

为了让视图响应,您需要在该公共属性的设置器中实现 inotifypropertychanged 并引发属性更改。

https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-implement-property-change-notification

从以上。

如果 PersonName 绑定到视图中的文本块。

  public string PersonName
  {
      get { return name; }
      set
      {
          name = value;
          // Call OnPropertyChanged whenever the property is updated
          OnPropertyChanged();
      }
  }

在命令中,您可以执行以下操作:

 PersonName = "Andy";

调用 PersonName 的 setter 和绑定到 PersonName 的文本块将读取新值。

于 2020-06-20T12:04:22.037 回答