【问题标题】:WPF - Get Hyperlink command from data?WPF - 从数据中获取超链接命令?
【发布时间】:2010-10-20 19:49:03
【问题描述】:

在 WPF 中,如何获取对超链接应从对象属性调用的命令的引用?

我正在使用 MVVM 模式创建 WPF 应用程序。主窗口中的列表框显示超链接。单击时,每个超链接都会调用视图模型的 ICommand 属性之一。如何指定应该调用哪个 ICommand?

这是我到目前为止所尝试的:超链接包含在 ViewModel.Hyperlinks 属性中,该属性绑定为列表框的 ItemsSource。 Hyperlinks 属性包含 MyHyperlink 类型的对象:

public class MyHyperlink
{
    public string Text { get; set; }
    public string ViewModelCommand { get; set; }
    public int RecordID { get; set; }
}

MyHyperlink.ViewModelCommand 属性包含单击超链接时应调用的视图模型 ICommand 的名称。我想使用该值为 WPF 超链接控件的 Command 属性指定 PropertyPath . 我尝试使用命令名称为列表框创建 PropertyPath 资源,但 WPF 不会接受。这是我的 XAML:

<ListBox ItemsSource="{Binding Hyperlinks}">
    <ListBox.Resources>
        <PropertyPath x:Key="CommandPath" Path="{Binding ViewModelCommand}" />
    </ListBox.Resources>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <Hyperlink Command="{StaticResource CommandPath}"
                        CommandParameter="{Binding Path=RecordID}">
                    <TextBlock Text="{Binding Text}" />
                </Hyperlink>
            </TextBlock>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

如何指定单击超链接时应调用哪个 ICommand?我是创建一个资源(如上所示),还是它以其他方式完成?我需要在 XAML 中执行此操作——我不想诉诸代码隐藏。感谢您的帮助!

【问题讨论】:

    标签: wpf mvvm hyperlink


    【解决方案1】:

    我认为您上面的代码不起作用,因为Hyperlink.Command 的类型是ICommand,而不是string。您要么需要修改MyHyperlink 类,使ViewModelCommand 也是ICommand,要么编写IValueConverter,以便在视图模型中给定命令名称的情况下找到正确的ICommand 实现。

    【讨论】:

      【解决方案2】:

      我已经实现了一个使用 IValueConverter 的解决方案。它写成an article on The Code Project。希望它能帮助其他人。

      【讨论】:

      • 在您关于动态命令的代码项目文章中,您提到有比使用 IValueConverter 更好的方法。你能告诉我们这个秘密吗?
      • 没有成功。我正在使用 IValueConverter。所以,没有秘密。
      猜你喜欢
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 2010-11-13
      • 1970-01-01
      相关资源
      最近更新 更多