【问题标题】:Command Binding in WPF cannot read value of propertyWPF 中的命令绑定无法读取属性值
【发布时间】:2018-07-09 12:32:17
【问题描述】:

我有以下代码:

XAML 代码段:

<TextBox HorizontalAlignment="Left" Height="23" Margin="10,57,0,0" TextWrapping="Wrap" Text="{Binding Name}" VerticalAlignment="Top" Width="140">
   <TextBox.DataContext>
      <ViewModels:FilterViewModel/>
   </TextBox.DataContext>
</TextBox>
<Button Content="Filtern" HorizontalAlignment="Left" Margin="420,57,0,0" VerticalAlignment="Top" Width="75" Command="{Binding FilterButton}" CommandParameter="{Binding Filter}">
   <Button.DataContext>
      <ViewModels:FilterViewModel/>
   </Button.DataContext>
</Button>

FilterViewModel.cs:

class Button : ICommand
{
    public delegate void ICommandOnExecute(object parameter);
    public delegate bool ICommandOnCanExecute(object parameter);

    private ICommandOnExecute _execute;
    private ICommandOnCanExecute _canExecute;

    public Button(ICommandOnExecute onExecuteMethod, ICommandOnCanExecute onCanExecuteMethod)
    {
        _execute = onExecuteMethod;
        _canExecute = onCanExecuteMethod;
    }

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

    public bool CanExecute(object parameter)
    {
        return _canExecute.Invoke(parameter);
    }

    public void Execute(object parameter)
    {
        _execute.Invoke(parameter);
    }
}

class FilterViewModel
{
    public ICommand FilterButton { get; set; }

    public FilterViewModel()
    {
        this.FilterButton = new Button(FilterExecute, canExecute);
    }

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

    public void FilterExecute(object paramter)
    {
        Console.WriteLine("Test: " + name);
    }

    private String name;
    public String Name
    {
        get
        {
            return name;
        }
        set
        {
            Console.WriteLine(value);
            name = value;
        }
    }
}

因此,当我单击按钮时,我希望将文本框的内容打印到控制台。例如输入 =“123”-> 输出应该是“测试:123”。 然而,我在文本框中写什么并不重要,结果总是只有输出:“测试:”。属性“name”的值被完全忽略。

感谢您的帮助!

【问题讨论】:

  • 不要创建多个视图模型实例。您在第一个视图模型中更改名称,但从第二个触发命令 - 其中名称是 null
  • 也就是说,不要显式设置TextBox和Button的DataContext。相反,设置 MainWindow 的 DataContext 一次。然后,所有子元素都会继承 DataContext 值。
  • 这绝对有道理!谢谢你。应该从一开始就很清楚。

标签: c# wpf binding command


【解决方案1】:

您似乎正在使用视图模型的两个实例。将定义移动到包含 TextBox 和 Button 的 MainWindow(或类似的顶级父级)。然后,所有子元素都会继承 DataContext 值。

<Window.DataContext>
   <ViewModels:FilterViewModel />
</Window.DataContext>

然后您可以删除 TextBox 和 Button 的定义。

【讨论】:

    猜你喜欢
    • 2014-05-10
    • 2021-12-15
    • 2021-11-05
    • 1970-01-01
    • 2022-06-16
    • 2022-07-28
    • 2019-09-24
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多