【发布时间】: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 吗?我在视图中添加自定义控件并将其绑定到视图模型中的某些内容。