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アプリケーションがあります。ビューモデルでは、GetOddsCommandがあります。

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

private void GetOdds()
{

}

StackPanelコマンドに配置された最初のボタンのコメントを外すとうまくいきます。デバッガーがgetにステップインし、コマンドをクリックするとデバッガーがGetOddsメソッドにステップインします。ただし、ListViewにある2番目のボタンでは機能しません。2番目のボタンに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は、ListViewItemではなくListViewのものであることに注意してください...
CommandParameterに対して同じ種類のバインディングを実行することをお勧めします-実際に何を求めているかによって異なります。

さて、内部にハイパーリンクを追加すると問題が発生します-ハイパーリンクをクリックしてもボタンは実際にはクリックされないため、コマンドは表示されません。ハイパーリンクのない領域をクリックすると、すべて問題ありません...

本当にそこにハイパーリンクが必要な場合は...周囲のテキストブロックのをfalseに設定できますIsHitTestVisible

例えば:

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

これは、コマンドを別のデータコンテキストでバインドしているためです。

StackPanelでは、現在のデータコンテキストでコマンドをバインドしています。これは、おそらくコマンドを保持しているビューモデルです。

ListViewで、コマンドを別のデータコンテキストにバインドしています。これは、おそらくコマンドを保持していないLinkオブジェクトであると私が信じている現在のリストアイテムです。

コマンドをStackPanelと同じ動作にする場合は、リストビューに名前を付けて、ListViewItemデータコンテキストではなくListViewデータコンテキストでバインディングを作成します。

<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 に答える