这类似于我几天前提出的一个问题。但是,我现在对这个问题有了更好的理解,所以我想再接受一下。
我正在创建一个MVVM应用程序,其中(除其他外)显示一个包含用户警报的列表框。这些警报涉及必须定期执行的各种例行任务,每个警报都包含一个超链接,当单击该超链接时,将打开执行与警报相关的任务所需的编辑器和记录。
当我尝试将这些超链接绑定到ICommands时,我的问题就出现了。应用程序的命令都是ICommand对象,并在视图模型中公开为命令属性。通常,绑定到命令就像Command =“Foo”一样简单,其中Foo是视图模型命令属性。
但这对我的超链接不起作用。原因如下:ListBox通过其ItemsSource属性绑定到名为Alerts的视图模型中的collection属性。此集合由Alert对象组成,其中包含创建警报及其相关超链接所需的信息。
但是,由于ListBox绑定到Alerts集合,因此其元素只能访问该集合,而不能访问视图模型的其余部分!换句话说,我的超链接不会有权访问他们需要绑定的命令属性。 Command = Foo根本不起作用,因为WPF无法在Alerts集合上找到Foo属性,即使视图模型具有带有该名称的命令属性。
我可以通过一个相当丑陋的黑客来解决这个问题,这个黑客涉及使用IValueConverter来实例化我需要的ICommands。超链接绑定到它需要的ICommand的名称(来自Alert对象),IValueConverter交换ICommand本身的新实例的名称。
我对这个解决方案并不满意。我一直试图弄清楚如何从视图模型命令属性创建资源,以便我可以像这样绑定超链接命令:
<Hyperlink Command={StaticResource Foo} />My Hyperlink</Hyperlink>
但我无法弄清楚如何创建资源。
如何解决这个问题的任何建议将不胜感激。谢谢你的帮助!
答案 0 :(得分:1)
为什么不公开Command
中的AlertViewModel
呢?即使它实际上是从父视图模型中获取它:
public class MainViewModel
{
private ICollection<AlertViewModel> _alerts = ...;
private ICommand _theCommand = ...;
public ICommand TheCommand
{
get { return __theCommand; }
}
private void SomeMethod()
{
_alerts.Add(new AlertViewModel(this));
}
}
public class AlertViewModel
{
private readonly MainViewModel _mainViewModel;
//ctor omitted
public ICommand TheCommand
{
get { return _mainViewModel.TheCommand; }
}
}
答案 1 :(得分:0)
我已经实现了IValueConverter方法。该解决方案记录了演示项目on The Code Project。希望它可以帮助其他人。