3

私はチェックリスト アプリケーションに取り組んでおりListBox、データを表示するために を使用しています。ListBoxユーザーが押すボタンに基づいて、配列を使用してデータを入力しています。(これがベスト プラクティスかどうかはわかりませんが、今のところ問題ありません。) ユーザーが手順を完了すると、次のコマンドでアイテムを削除できます。

private void SendSelected()
{
    while (lstToDo.SelectedItems.Count > 0)
    {
        lstToDo.Items.Remove(lstToDo.SelectedItem);
    }
}

問題は、今日、以下の xaml を使用してCheckBoxes を myに追加する方法を学んだことです。ItemTemplate

<ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <CheckBox Padding="10">                            
                <CheckBox.LayoutTransform>
                    <ScaleTransform ScaleX="1" ScaleY="1" />
                </CheckBox.LayoutTransform>
            </CheckBox>
            <TextBlock Text="{Binding}"/>
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>

削除ボタンは引き続き機能します...ただし、選択したアイテムではなくチェックしたアイテムを削除するように調整したいと思います。winforms では、以前は次のようにしていました。

while (lstToDo.CheckedItems.Count > 0)
{
    lstToDo.Items.Remove(lstToDo.CheckedItems[0]);
}  

しかし、WPF では、明らかにこの方法は機能しません。その理由はわかりません。

4

4 に答える 4

2

チェックボックスを ListBoxItem の IsSelected プロパティにバインドできます

<DataTemplate>
    <CheckBox Content="{Binding .}" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, Path=IsSelected" />
</DataTemplate>
于 2013-01-16T21:15:29.457 に答える
0
 private void RemoveButton_Click(object sender, RoutedEventArgs e)
  {   
   foreach(CheckedItem in lstToDo.SelectedItems)
  {
    (lsttoDo.ItemsSource as List).Remove(CheckedItem);
  }
    lsttoDo.Items.Refresh();
 }

あなたのc#

于 2013-01-16T21:27:27.397 に答える
0

ModelChecked プロパティを使用して項目を作成するだけで、UI でデータを変更MyListすると更新され、コードで項目を更新するとMyListUI に変更が反映されます。

したがって、チェックした項目をすべて削除すると、MyListそれらはListBox

public partial class MainWindow : Window
{
    private ObservableCollection<MyObject> _myItems = new ObservableCollection<MyObject>();

    public MainWindow()
    {
        InitializeComponent();
        MyItems.Add(new MyObject { Name = "Test1" });
        MyItems.Add(new MyObject { Name = "Test2" });
        MyItems.Add(new MyObject { Name = "Test3" });
        MyItems.Add(new MyObject { Name = "Test4" });
    }

    public ObservableCollection<MyObject> MyItems
    {
        get { return _myItems; }
        set { _myItems = value; }
    }

    public void RemoveItems()
    {
        // Remove any items fro MyList that "IsChecked"
    }
}

public class MyObject : INotifyPropertyChanged
{
    private string _name;
    private bool _isChecked;

    public string Name
    {
        get { return _name; }
        set { _name = value; NotifyPropertyChanged("Name"); }
    }

    public bool IsChecked
    {
        get { return _isChecked; }
        set { _isChecked = value; NotifyPropertyChanged("IsChecked"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

xaml:

<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="199" Width="206" Name="UI">
    <Grid DataContext="{Binding ElementName=UI}">
        <ListBox ItemsSource="{Binding MyItems}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <CheckBox Padding="10" IsChecked="{Binding IsChecked}">
                            <CheckBox.LayoutTransform>
                                <ScaleTransform ScaleX="1" ScaleY="1" />
                            </CheckBox.LayoutTransform>
                        </CheckBox>
                        <TextBlock Text="{Binding Name}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>
于 2013-01-16T21:28:15.140 に答える
0

データにラッパーを使用します。これには、IsChecked プロパティなどのビュー固有のデータが含まれます。プロパティを CheckBox にバインドすると、チェックされているすべてのアイテムを見つけることができます...

簡単な例:

public class CheckedItem<T> where T : class
{
    public T Data { get; set; }
    public bool IsChecked { get; set; }
}

したがって、あなたのリストの代わりに、次のリストMyItemを作成しますCheckedItem<MyItem>

それに応じてバインディングを変更するだけではありません:

<ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox Padding="10" IsChecked={Binding IsChecked}>                            
                    <CheckBox.LayoutTransform>
                        <ScaleTransform ScaleX="1" ScaleY="1" />
                    </CheckBox.LayoutTransform>
                </CheckBox>
                <TextBlock Text="{Binding Data}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>

チェックされているアイテムのみを削除したい場合は、次のように取得できます。

List<CheckedItem<MyItem>> MyItems; 
...
...

foreach (var Item in MyItems)
{
    if (!Item.IsChecked)
    {
         lstToDo.Items.Remove(Item);
    }
}
于 2013-01-16T21:16:20.770 に答える