0

チェックボックスを含むリストボックスがあります。チェックボックスがオンになっているすべてのアイテムのコンテンツを文字列配列で取得したい。どうすればこれを入手できますか?

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
    <ListBox x:Name="TrackingView1" Margin="9,0,2,5"> 
        <ListBox.ItemTemplate> 
            <DataTemplate> 
                <CheckBox x:Name="fileNameLinkButton" Content="{Binding BindsDirectlyToSource=True}" FontFamily="Segoe WP Semibold" Foreground="Black" FontSize="20" /> 
            </DataTemplate> 
        </ListBox.ItemTemplate> 
    </ListBox> 
</Grid>
4

2 に答える 2

3

VisualTreeHelperを使用してデータテンプレートアイテムを取得できます。このメソッドを使用して、データテンプレートの最初のアイテムを取得します。

 //method for finding first element of the listbox data template
    private T FindFirstElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject
    {
        var count = VisualTreeHelper.GetChildrenCount(parentElement);
        if (count == 0)
            return null;
        for (int i = 0; i < count; i++)
        {
            var child = VisualTreeHelper.GetChild(parentElement, i);
            if (child != null && child is T)
            { return (T)child; }
            else
            {
                var result = FindFirstElementInVisualTree<T>(child);
                if (result != null)
                    return result;
            }
        }
        return null;
    }

次に、ボタンをクリックするなど、必要な場合にこのコードを使用します

 int itemsCount = this.TrackingView1.Items.Count;
 List<string> myList = new  List<string>();
 for (int i = 0; i < itemsCount; i++)
 {
            ListBoxItem item = (ListBoxItem)this.TrackingView1.ItemContainerGenerator.ContainerFromIndex(i);
            CheckBox tagregCheckBox = FindFirstElementInVisualTree<CheckBox>(item);
            if((bool)tagregCheckBox.IsChecked)                
              myList.Add(tagregCheckBox.Content.ToString());
 }
于 2012-07-04T06:20:01.170 に答える
0

従来の教科書のアプローチでは、「TrackingView1」をIListにバインドできます。ここで、PersonClassは次のようになります。

public class PersonClass
{
    public string Name { get; set; }
    public bool IsSelected { get; set; }

    public PersonClass(string name, bool isSelected)
    {
    this.Name = name;
    this.IsSelected = isSelected;
    }
}

データを収集したい時点で、

string[] checkedNames = (from name in Names
            where name.IsSelected
            select name.Name).ToArray();

私は実際にはToArray()を避け、UIに直接アクセスします

于 2012-07-02T07:38:26.987 に答える