0

私は WPF が初めてで、問題の解決策が見つかりません。

ViewModel に Observable Collection があります。

ObservableCollection<Process>

Process クラス内には、別の ObervableCollection があります。

ObservableCollection<BurstTime>

新しいプロセスがアクティブ化されるたびに、ビュー内の StackPanel の 1 つに新しいユーザー コントロール (プロセス データの実際の状態を視覚化できるもの、およびバースト時間) を動的に追加し、プロセスがアクティブになったときにそれを削除します。終了しました(監視可能なコレクションが変更されたとき)..実行中に、バーストタイムコレクションを表示したい..

ユーザー コントロールのコード ビハインドで CollectionChanged イベントをサブスクライブし、別のユーザー コントロール内でユーザー コントロールを使用して、イベント ハンドラーの実行時に必要な TextBlocks を動的に作成しようとしましたが、常に System.Reflection.TargetInvocationException (内部例外: システム) が発生します。 .NullReferenceException) 私の外側の InitializeComponent() が実行されているとき..

public ResourceUseView()
{
    InitializeComponent();
    ((ObservableCollection<Process>)DataContext).CollectionChanged += ResourceUseView_CollectionChanged;
}

それは可能ですか?ObservableCollection の要素の変更に対応しながら、外側の UserControl の分離コードでユーザー コントロールを作成または削除し、内側の ObservableCollection で要素が変更されたときに外側を更新することはできますか? 別のユーザー コントロール内でユーザー コントロールを動的にインスタンス化する以外の方法はありますか? ObservableCollection に ObservableCollection を表示できる特別なコントロールはありますか?

(可能であれば、ObservableCollection の要素と同じくらい異なるユーザー コントロールを使用したいと考えています。)

ご協力いただきありがとうございます!

4

1 に答える 1

1

DataContextコンストラクターはデータ バインディングの前に実行されるため、コンストラクターが実行される時点であるため、おそらくそのエラーが表示されますnull

コレクションにバインドするには、プロパティを含むコントロールを使用しItemsSourceます。また、ネストされたコレクションにバインドする場合は、コントロールの を変更して、ネストされたコレクションのプロパティをItemTemplate持つ別のコントロールを使用します。ItemsSource

を使用した例を次に示します。ItemsControl

<ItemsControl ItemsSource="{Binding Processes}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ItemsControl ItemsSource="{Binding BurstTimes}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

興味があればItemsControl 、私のブログにいくつかの例があります。

UserControl各オブジェクトにを指定する場合ItemTemplateは、最初の for を に設定ItemsControlProcessUserControl、内部で にProcessUserControlバインドItemsControlして、それの forBurstTimesを使用します。BurstTimeUserControlItemTemplate

<ItemsControl ItemsSource="{Binding Processes}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <local:ProcessUserControl />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

...

<UserControl x:Class="MyNamespace.ProcessUserControl ...>
    ...
    <ItemsControl ItemsSource="{Binding BurstTimes}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <local:BurstTimeUserControl />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    ...
</UserControl> 
于 2013-04-29T15:34:26.193 に答える