当前位置: 首页 > 知识库问答 >
问题:

在WPF中更改命令中DataContext的值

徐安康
2023-03-14

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

public partial class MainWindow : Window
    {
        ViewModel _vm = new ViewModel();
        public MainWindow()
        {
            InitializeComponent();

            _vm.BtnClick = new BtnClick();

            DataContext = _vm;
        }
    }

public class BtnClick : ICommand
    {
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

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

        public void Execute(object parameter)
        {
            Debug.WriteLine(parameter.ToString());
        }
    }

public class ViewModel
    {
        public ICommand BtnClick { get; set; }
        public string Input { get; set; }
        public string Output { get; set; }
    }
<StackPanel>
        <TextBox Text="{Binding Input}"></TextBox>
        <TextBlock Text="{Binding Output}"></TextBlock>
        <Button Command="{Binding Path=BtnClick}" CommandParameter="{Binding Input}">Translate</Button>
    </StackPanel>

命令正确地从textbox中获取值,现在我想用这个值做一些事情,并将它保存到outputer中。 问题是从命令角度来看,我无法同时访问DataContextViewModel

共有1个答案

贺高飞
2023-03-14

任何命令的实现通常都在ViewModel中。

通常使用框架或助手类。

例如:

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;
  }

);

这里,有一个匿名方法,其中有那个“点击的按钮”。

这将捕获父ViewModel中的变量

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

为了使视图做出响应,您需要实现inotifypropertychanged并在该公共属性的setter中引发property changed。

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

从上面。

如果PersonName绑定到视图中的textblock。

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

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

 PersonName = "Andy";

它调用PersonName的setter,绑定到PersonName的textblock将读取新值。

 类似资料:
  • 我有以下代码: MainWindow.xaml Employee.cs 这是非常简单的代码,我只想将我的 Employee.cs 类中的 和 属性绑定到 MainWindow.xaml 中文本框的文本属性,但在运行代码时,这些文本框中没有出现任何内容。绑定正确吗?

  • 问题内容: 在泊坞窗中,我想这样做: 但是,因为没有cd命令,所以每次都必须传递完整路径(使XYZ / fullpath)。有什么好的解决方案吗? 问题答案: 您可以运行脚本,也可以运行更复杂的参数。这是我先前下载的Dockerfile中的示例: 由于使用了“ &&”,如果所有先前的命令都成功,它将仅到达最终的“ pip install”命令。 实际上,由于每个RUN都会创建一个新的提交和AUFS

  • 在我的wpf项目中,我使用以下代码更改鼠标光标: 我调度员。调用(New SetCursorCallback(SetCursor的地址),New Object(){Cursors.Wait}) 定义如下: 委托子SetCursorCallback(ByVal[CursorType]作为系统。Windows。输入。光标) 在一个处理按键的子程序中,我检查按下的键是否为删除键,如果为真,我使用消息框提

  • 所以我正在编辑一个插件,是为我的世界龙头。 在反编译程序/调试器中,这就是“FlyCommand”显示的内容。在我下面上课。龙卷风915。蓬松的 https://pastebin.com/KB3jLX7S 下面是我的intellij项目中显示的同一个文件。 https://pastebin.com/kqX3DzTu 我想换个角色 我从intellij假设这是它需要编辑的地方。但是我不知道如何改变,

  • 在我的项目中,我有固定的页眉和页脚,以及可变的内容。所以我已经将ContentControl放在了我的窗口中。 看起来是这样的... 我创建了两个名为page1、Page2用户控件。第1页有一个按钮,当我单击该按钮时,ContentControl有显示Page2。 所以我用button1_Click编写了下面的代码 但是在点击按钮的时候ContentControl没有改变我能做什么呢? 我的pag

  • 如何使用cli命令而不是手动使用将当前运行的项目更改为GCP(Google Cloud Platform)帐户中的另一个项目。

  • 调用时出现问题 System. Windows. Data错误:4:找不到引用“RelativeSource FindAncestor, AncestorType='PhotoBrowser. List. ViewModel. ListViewModel', AncestorLine='1”的绑定源。BindingExpress:路径=测试;数据项=空;目标元素是“EventTo命令”(HashC

  • 我有一个雇主组合。选择雇主后,表格中会填入特定于雇主的数据: 下面是它绑定到的属性和检查表是否脏的方法。如果表是脏的,则提示用户如果他们改变雇主,改变将丢失: 一切似乎都正常工作: 用户选择更新表的雇主('KMH')。 用户对表进行更改。 用户然后选择不同的雇主('MPC') 提示用户更改将丢失 用户选择“否”并且Can火雇主返回“假” 选择雇主不改变(跳过if{}块) 然而,在GUI中,雇主选项