0

MultiSelectListで現在選択されているアイテムをObservableCollectionに入力しようとしています。選択方法にはチェックボックスコントロールが含まれ、選択したアイテムを取得してObservableCollectionに入力する方法がわかりません。MultiSelectListの単一選択とMultiSelectListの「すべて選択」オプションを実行する2つのメソッドを参照しました。

注意すべき点として、networkSelectListは、カスタム設定クラスのObservableCollectionです。

MainPage.xaml

<toolkit:MultiselectList x:Name="connectionTypeMultiSelectList" HorizontalAlignment="Left" VerticalAlignment="Top" Tap="connectionTypeMultiSelectList_Tap">
    <toolkit:MultiselectList.ItemTemplate>
        <DataTemplate>

            <StackPanel Orientation="Horizontal"  Margin="12,0,0,0">
                <Image Source="{Binding Icon}" Width="35" Height="35" Margin="0"/>
                <TextBlock Text="{Binding Name}" TextAlignment="Center"  Margin="10"/>
            </StackPanel>

        </DataTemplate>
    </toolkit:MultiselectList.ItemTemplate>                            
</toolkit:MultiselectList>

MainPage.xaml.cs

/// <summary>
    /// method to Select All and UnSelect All checkboxes
    /// </summary>
    /// <param name="selected"></param>
    /// <param name="predicate"></param>
    private void SetCheckBoxesSelected(bool selected, Predicate<ConnectionItem> predicate)
    {
        if (networkTypeList == null)
        {
            return;
        }
        if (predicate == null)
        {
            predicate = (networkInfo) => true;
        }


        ItemContainerGenerator itemContainerGenerator = this.connectionTypeMultiSelectList.ItemContainerGenerator;


        foreach (ConnectionItem networkInfo in networkTypeList)
        {
            if (networkInfo != null && predicate(networkInfo))
            {
                DependencyObject visualItem = itemContainerGenerator.ContainerFromItem(networkInfo);
                MultiselectItem multiselectItem = visualItem as MultiselectItem;
                if (multiselectItem != null)
                {
                    multiselectItem.IsSelected = selected;

                    //add selected item to networkSelectionChecked  ??
                    //Settings.networkSelectionChecked.Value.Add(multiselectItem.Name.ToString());
                }
            }
        }
    }

    /// <summary>
    /// triggered on tap of any item in connectionTypeMultiSelectList
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void connectionTypeMultiSelectList_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    {
        DependencyObject tappedElement = e.OriginalSource as UIElement;
        MultiselectItem tappedItem = this.FindParentOfType<MultiselectItem>(tappedElement);
        ConnectionItem selectedItem = null;
        if (tappedItem != null)
        {
            // DataContext contains reference to data item
            selectedItem = tappedItem.DataContext as ConnectionItem;
        }


        if (selectedItem != null)
        {
            MessageBox.Show(selectedItem.Name + "Tapped");

            //add selected item to networkSelectionChecked  ??
            //Settings.networkSelectionChecked.Value.Add(multiselectItem.Name.ToString());

        }
    }

    /// <summary>
    /// method to find out the element in VisualTree
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="element"></param>
    /// <returns></returns>
    private T FindParentOfType<T>(DependencyObject element) where T : DependencyObject
    {
        T result = null;
        DependencyObject currentElement = element;
        while (currentElement != null)
        {
            result = currentElement as T;
            if (result != null)
            {
                break;
            }
            currentElement = VisualTreeHelper.GetParent(currentElement);
        }
        return result;
    }

    void unselectAll_Click(object sender, EventArgs e)
    {
        this.SetCheckBoxesSelected(false, null);
        this.connectionTypeMultiSelectList.IsSelectionEnabled = false;
    }

    void selectAll_Click(object sender, EventArgs e)
    {
        this.SetCheckBoxesSelected(true, null);
    }

したがって、基本的には、選択された各アイテムをObservableCollectionに追加しようとしています。これを実現して、選択したチェックボックスを表すクエリ文字列を渡してセカンダリタイルを作成し、それらを更新できるようにします。選択したチェックボックス項目をObservableCollectionに正しく追加するにはどうすればよいですか?同様の意味で、アイテムが選択されていないことを検出し、そのアイテムをObservableCollectionから削除するにはどうすればよいですか?さらに、MultiSelectListで選択したアイテムを永続化して、将来のアプリケーションの起動やアクティブ化のために保存できるようにする正しい方法はありますか?

4

1 に答える 1

1

選択したアイテムは、SelectedItemsプロパティから取得できます。

var selectedItems = new ObservableCollection<ConnectionItem>(connectionTypeMultiSelectList.SelectedItems.Count);
foreach (var item in TextItemsList.SelectedItems)
{
    var connectionItem = item as ConnectionItem;
    if (connectionItem == null) continue;
    selectedItems.Add(connectionItem );
}

SelectionChangedイベントは、アイテムが(選択解除されて)選択されたときに通知します。

void MultiSelectListSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    foreach(var item in e.AddedItems)
    {
        // add to collection
    }
    foreach(var item in e.RemovedItems)
    {
        // remove from collection
    }
}
于 2012-08-15T04:59:01.643 に答える