0

オブジェクトのリストの内容を視覚的に表示する特定のItemTemplateを持つListViewがあります。ユーザーがそのようなオブジェクトをクリックして選択できるようにしたかったのですが、それを選択した結果、アプリケーションの現在のオブジェクトとして読み込まれ、リストから削除されます。

問題は、リストビューがClickイベントをサポートしていないことです。そこで、SelectionChangedイベントを使用してみました。アイテムをクリックして(ただし、マウスを離さずに)、マウスを別のアイテムの上に移動すると(マウスを押したまま)、そのアイテムも削除されるため、これも問題ありません。

追加の操作をトリガーせずに、選択したアイテムをリストから削除する方法についての提案はありますか?これが私のコードの簡略化されたバージョンです(これは同じ振る舞いをします):

<Window x:Class="ListViewIssue.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition Height="50"></RowDefinition>
        </Grid.RowDefinitions>
        <ListView x:Name="lstNumbers"  SelectionMode="Single"  ScrollViewer.HorizontalScrollBarVisibility="Disabled" SelectionChanged="lstNumbers_SelectionChanged">
            <ListView.ItemTemplate>                
                <DataTemplate>
                    <Grid Width="170" Background="Transparent">                        
                        <TextBlock HorizontalAlignment="Left" Text="{Binding val, Mode=TwoWay}" TextWrapping="Wrap" Margin="3"/>
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
        <Button Name="btnAddItem" Grid.Row="1" Click="btnAddItem_Click">Add Item</Button>
    </Grid>
</Window>

とコードビハインド:

public partial class MainWindow : Window
    {
        public class valueClass
        {
            public int val { get; set; }
        }
        private List<valueClass> list;
        private int counter;

        public MainWindow()
        {
            InitializeComponent();
            CreateList();
            DisplayList();
        }

        private void CreateList()
        {
            list = new List<valueClass>();
            counter = 8;
            for (int i = 0; i < counter; i++)
            {
                list.Add(new valueClass() { val = i + 1 });
            }
        }

        private void lstNumbers_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (lstNumbers.SelectedIndex != -1)
            {
                list.Remove(lstNumbers.SelectedValue as valueClass);
                DisplayList();
            }
        }

        private void DisplayList()
        {
            this.lstNumbers.ItemsSource = null;
            this.lstNumbers.ItemsSource = list;
        }

        private void btnAddItem_Click(object sender, RoutedEventArgs e)
        {
            list.Add(new valueClass() { val = counter++ + 1 });
            DisplayList();
        }
    }
4

3 に答える 3

1

そこのコメントウォールから目立つように答えに入れました。

selectionchangedで削除しているので、それが変更されるたびに削除します。PreviewMouseUpで削除ロジックを使用して、そこでアイテムを取得してみてください。そうすれば、何かをクリックしても、クリックが終了するまでアイテムは削除されません。

お役に立てれば。

于 2011-10-19T13:09:21.987 に答える
0

コードビハインドを避け、MVVMデザインパターンを採用する必要があります。この場合、(代わりにこれができない理由はありませんが)のをバインドしSelectedItem、値の変更に応じてコレクションからビューモデルのを削除ListViewします。ListBoxSelectedItem

于 2011-10-19T13:07:43.930 に答える
0

私の解決策

private void lstNumbers_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (lstNumbers.SelectedIndex != -1)
            { 
                lstNumbers.SelectionChanged-=lstNumbers_SelectionChanged;
                list.Remove(lstNumbers.SelectedValue as valueClass);
                DisplayList();
                lstNumbers.SelectionChanged+=lstNumbers_SelectionChanged;
            }
        }
于 2017-09-24T10:21:04.987 に答える