7

リストビュー内に、選択したアイテムを削除するためのボタンがあります。ボタンをクリックすると、RemoveSubjectCommandが起動しません。リストビューの外にボタンを置くと、正常に機能しています。ネストされたアイテムが原因です。どうすればこの問題を解決できますか?

<ListView HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
        HorizontalContentAlignment="Stretch" Grid.ColumnSpan="3" Grid.Row="2"
        ItemsSource="{Binding AssignedSubjects}">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Center" />
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.View>
        <GridView>
            <GridViewColumn Width="140" Header="Subjects" DisplayMemberBinding="{Binding Name}" />
            <GridViewColumn Width="auto">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="X" Command="{Binding RemoveSubjectCommand}"  />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

モデルを表示、

private ICommand removeSubjectCommand;
**
public ICommand RemoveSubjectCommand
{
    get { return removeSubjectCommand ?? (removeSubjectCommand = new RelayCommand(param => this.RemoveSubject(), null)); }
}
**
private void RemoveSubject()
{ ***
}

次のコードを入れれば問題なく動作します。

<ListView.InputBindings>
    <KeyBinding Key="Delete" Command="{Binding RemoveSubjectCommand}" />
</ListView.InputBindings>
4

3 に答える 3

14

これは、ボタンの DataContext が ListBoxItem DataContext であるためです。したがって、親の ListView DataContext に移動する必要があります。

これを行う 1 つの方法は、ListView に名前を付け、要素名でバインドすることです。

<ListView Name="lv" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
        HorizontalContentAlignment="Stretch" Grid.ColumnSpan="3" Grid.Row="2"
        ItemsSource="{Binding AssignedSubjects}">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Center" />
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.View>
        <GridView>
            <GridViewColumn Width="140" Header="Subjects" DisplayMemberBinding="{Binding Name}" />
            <GridViewColumn Width="auto">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="X" Command="{Binding ElementName=lv,Path=DataContext.RemoveSubjectCommand}"  />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

于 2012-11-27T12:57:43.657 に答える
8

Command をFindAncestorを使用してバインドする必要があります。それ以外の場合は、ViewModel ではなく、ListViewItemRemoveSubjectCommandのデータ コンテキストを使用してにバインドしようとします。

これを試して:

<Button Content="X" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}, Path=DataContext.RemoveSubjectCommand}"  />
于 2012-11-27T12:54:17.457 に答える
2

ボタンをリストビューの外に置くと、正常に機能します

RemoveSubjectCommandプロパティはitemListViewのデータ コンテキストではなく、 のデータ コンテキストで定義されるためです。

于 2012-11-27T12:56:53.407 に答える