0

我是 WPF 新手,我找不到解决问题的方法。

我的 ViewModel 中有一个 Observable 集合:

ObservableCollection<Process>

在 Process 类中是另一个 ObervableCollection:

ObservableCollection<BurstTime>

我想每次在我的视图中动态添加一个新的用户控件(可以可视化进程数据的实际状态,以及它的突发时间),当激活一个新进程时,并在进程启动时将其删除结束(当可观察的集合发生变化时)..在它运行期间,我想显示它的 Burst Time 集合,什么可以及时改变..

我尝试在我的用户控件的代码隐藏中订阅 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

构造函数在数据绑定之前运行,因此您可能会看到该错误,因为在构造函数运行DataContextnull

若要绑定到集合,请使用包含ItemsSource属性的控件。如果要绑定到嵌套集合,请修改ItemTemplate控件的 以使用具有ItemsSource嵌套集合属性的另一个控件。

这是一个使用ItemsControl

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

如果你有兴趣ItemsControl ,我在我的博客上有一些例子。

如果要UserControl为每个对象指定 a ,则将ItemTemplatefor first设置ItemsControlProcessUserControl,并在其中ProcessUserControl绑定ItemsControlBurstTimes并使用 a BurstTimeUserControlfor it'sItemTemplate

<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 回答