1

リストボックスからプログラムで関連するObservableCollectionを決定する方法はありますか?

ItemsSourceをXAMLのListBoxにバインドし、ユーザーがその中からアイテムを選択したときに、そのアイテムがどのListBoxからのものであるか(私が管理した)だけでなく、ObservableCollectionを関連付けて取得するようにプログラムに指示します。それと。

sourceContainer.ItemsSource.ToString()(sourceContainerはプログラムで検出されたListBox)を使用することで、その背後にあるDataBoundObservableCollectionを判別できると思いました。ただし、そうではありません。私は何が欠けていますか?

ありがとう!

編集:ObservableCollectionsの作成と、どのボックスが選択されているかを判断する方法に関するコードを次に示します。(私はそれがおそらく最善の方法ではないことを知っています、私はまだ学んでいます...)

まず、XAML(各リストボックスには一般的なバインディング用のこの行があります):

ItemsSource="{Binding Path=ListOneItems}"

次に、ObservableCollectionsを作成するためのコード:

    private ObservableCollection<DataItem> listOneItems;

    public ObservableCollection<DataItem> ListOneItems
    {
        get
        {
            if (listOneItems == null)
            {
                listOneItems = new ObservableCollection<DataItem>();
            }
            return listOneItems;
        }
    }

プログラムが選択したアイテムの親を決定する場所は次のとおりです。

//Finds the name of the container that holds the selected SLBI (similar to finding the initial touched object)
FrameworkElement determineSource = e.OriginalSource as FrameworkElement;
SurfaceListBox sourceContainer = null;

while (sourceContainer == null && determineSource != null)
{
    if ((sourceContainer = determineSource as SurfaceListBox) == null)
    {
        determineSource = VisualTreeHelper.GetParent(determineSource) as FrameworkElement;
    }
}

//Name of the parent container
strParentContainer = sourceContainer.Name;

//Name of the ObservableCollection associated with parent container?

他に何か必要なことがあれば、私に知らせてください。

4

3 に答える 3

2

であるプロパティに直接バインドした場合はObservableCollection<T>、次のことができるはずです。

var col = (ObservableCollection<MyClass>)sourceContainer.ItemsSource;

そうでない場合は、関連する XAML とコードを投稿する必要があります。

于 2012-07-16T15:08:15.640 に答える
1

Eren の答えItemsSourceは正しいです。プロパティを正しいコレクション型にキャストすることで、実際のコレクションを取得できます。

ObservableCollection<DataItem> sourceCollection = 
    sourceContainer.ItemsSource as ObservableCollection<DataItem>;

コメントで提案したように Name プロパティのみが必要な場合は、Bindingforを取得ItemsSourcePropertyしてPathプロパティを確認できます

var binding = soureContainer.GetBindingExpression(ListBox.ItemsSourceProperty);
var sourceCollectionName = binding.ParentBinding.Path.Path;
于 2012-07-16T16:20:31.243 に答える
0

リストボックスに関連付けるコレクションは ObservableCollection ですか? 配列を設定すると、バックグラウンドで ObservableCollection への魔法の変換が行われません。

このロジックが必要な理由を教えてください。smth が他のロジックで間違っているとします。

于 2012-07-16T15:11:58.400 に答える