9
<StackPanel>
        <!--<Button Command="{Binding GetOddsCommand}" CommandParameter="{Binding}" />-->

    <ListView 
        ItemsSource="{Binding Links}"
        >
        <ListView.ItemTemplate>
            <DataTemplate>
                <Border>
                    <Button Command="{Binding GetOddsCommand}" CommandParameter="{Binding}">
                        <TextBlock >
                        <Hyperlink NavigateUri="http://www.onet.pl" >
                            <TextBlock Text="{Binding}" />
                        </Hyperlink>
                    </TextBlock>
                    </Button>
                </Border>
            </DataTemplate>
        </ListView.ItemTemplate>

我有 MVVM 应用程序。在 viewmodel 我有 GetOddsCommand:

public ICommand GetOddsCommand
{
    get
    {
        if (_getOddsCommand == null)
            _getOddsCommand = new RelayCommand(param => GetOdds());
        return _getOddsCommand;
    }
}

private void GetOdds()
{

}

当我取消注释放置在 StackPanel 命令中的第一个按钮时,效果很好。调试器进入 get,然后当我单击命令 Debugger 进入 GetOdds 方法时。但它在 ListView 中的第二个按钮中不起作用。看起来第二个按钮看不到 GetOddsCommand,但我不明白为什么

谢谢

4

2 回答 2

22

放置一个按钮并在其中放置一个超链接没有多大意义……当您单击超链接时,您期望会发生什么?
无论如何,以下代码将导致您的命令被调用:

<ListView ItemsSource="{Binding Links}" x:Name="ListView1">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Border>
                    <Button Command="{Binding ElementName=ListView1, Path=DataContext.GetOddsCommand}" CommandParameter="{Binding}">
                         <TextBlock Text="{Binding}" />
                    </Button>
                </Border>
            </DataTemplate>
        </ListView.ItemTemplate>
</ListView>

请注意,使用的 DataContext 是 ListView而不是ListViewItem ...
您可能希望对 CommandParameter 执行相同类型的绑定 - 取决于您真正追求的内容。

现在,在里面添加超链接会导致问题——如果你点击超链接,按钮并没有真正被点击,所以你不会得到命令,如果你点击一个没有超链接的区域,一切都会好起来的......

如果你真的想要那里的超链接......你可以将IsHitTestVisible周围的文本块设置为 false。

例如:

<TextBlock IsHitTestVisible="false">
    <Hyperlink NavigateUri="http://www.onet.pl"  >
    <TextBlock Text="{Binding}" />
</TextBlock>
于 2012-12-27T15:48:08.890 回答
10

这是因为您将命令绑定在不同的数据上下文中。

在 StackPanel 中,您将命令绑定在当前数据上下文中,这可能是您持有命令的视图模型。

在 ListView 中,您将命令绑定到不同的数据上下文,这是当前列表项,我认为它是可能不包含命令的 Link 对象。

如果您希望命令具有与 StackPanel 中相同的行为,只需为列表视图命名并在 ListView 数据上下文而不是 ListViewItem 数据上下文上进行绑定。

<ListView x:Name="linksListView" ItemsSource="{Binding Links}"> 
    <ListView.ItemTemplate>
        <DataTemplate>
            <Border>
                <Button Command="{Binding DataContext.GetOddsCommand, ElementName=linksListView}"
                        CommandParameter="{Binding DataContext, ElementName=linksListView}">
                    <TextBlock>
                        <Hyperlink NavigateUri="http://www.onet.pl" >
                            <TextBlock Text="{Binding}" />
                        </Hyperlink>
                    </TextBlock>
                </Button>
            </Border>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
于 2012-12-27T15:34:58.917 回答