【问题标题】:Can't bind to a command in my custom control无法绑定到我的自定义控件中的命令
【发布时间】:2018-03-09 05:16:52
【问题描述】:

我创建了一个基于 TextBox 的控件,如下所示:

public class DelayedTextBox : TextBox
{
    public ICommand DelayedTextChangedCommand
    {
        get;
        set;
    }
}

然后我使用以下代码创建 Foo.xaml:

<h:DelayedTextBox DelayedTextChangedCommand="{Binding FooCommand}"/>

我有 FooViewModel(它在 XAML 中正确连接,因为其他部分可以绑定到 FooViewModel 中的属性),它有:

private ICommand _fooCommand;
    public ICommand FooCommand
    {
        get
        {
            if (_fooCommand == null)
            {
                _fooCommand = new RelayCommand(CheckFoo, () => CanExecuteFooCheck());
            }

            return _fooCommand;
        }
    }

我正在使用 GalaSoft.MvvmLight 的 RelayCommand,它适用于我项目中的其他命令

运行项目时,加载 Foo.xaml 时出现以下错误:

WinRT 信息:未能分配给属性 'TestApp.Helpers.DelayedTextBox.DelayedTextChangedCommand'。 [行:29 位置:103] 类型异常 在 TestApp.exe 中发生“Windows.UI.Xaml.Markup.XamlParseException” 但未在用户代码 WinRT 信息中处理:分配失败 财产 'TestApp.Helpers.DelayedTextBox.DelayedTextChangedCommand'。 [行:29 位置:103]与此错误代码关联的文本无法 找到了。

未能分配给属性 'TestApp.Helpers.DelayedTextBox.DelayedTextChangedCommand'。 [行:29 位置:103]

我很困惑为什么它不能正确绑定,我做错了什么?

【问题讨论】:

  • 为什么命令会成为文本框的成员?
  • DelayedTextChangedCommand 不是依赖属性。每次我使用 XAML 属性设置某些东西时,“某物”都是 DP。
  • DelayedTextBox 将在用户输入文本框并停止输入一段时间后调用该命令。我添加了命令,以便可以将其绑定到我设置的某个命令,然后对文本框文本进行操作
  • 我建议查看 MVVM 模式。理想情况下,您应该分离 UI 和显示逻辑。该命令应该存在于视图模型中,并且 xaml 的数据上下文设置为视图模型。这将命令正在执行的操作与用于调用命令的 UI 完全分离。
  • 感谢 Lynn,添加依赖属性解决了这个问题。我不明白你的最后评论。我没有使用 MVVM 吗?我在视图中添加自定义控件并将其绑定到视图模型中的某些内容。

标签: c# xaml uwp uwp-xaml


【解决方案1】:

问题是我没有在我的问题中添加一个在 cmets 中提到的 @Lynn Crumbling 的dependencyProperty。

将以下内容添加到 DelayedTextBox 就可以了:

public static readonly DependencyProperty DelayedTextChangedCommandProperty =
    DependencyProperty.Register(
        "DelayedTextChangedCommand",
        typeof(ICommand),
        typeof(DelayedTextBox),
        new PropertyMetadata(0));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 2015-02-15
    相关资源
    最近更新 更多