ListBox超链接 - 调用ICommands

时间:2009-04-22 18:52:54

标签: wpf listbox hyperlink

这类似于我几天前提出的一个问题。但是,我现在对这个问题有了更好的理解,所以我想再接受一下。

我正在创建一个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>

但我无法弄清楚如何创建资源。

如何解决这个问题的任何建议将不胜感激。谢谢你的帮助!

2 个答案:

答案 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。希望它可以帮助其他人。