在用户控件中调用source时出错

时间:2014-01-17 10:13:40

标签: c# wpf mvvm

我正在使用以下代码,该代码按预期在主窗口上运行。

public partial class MainWindow : Window
{
    public  ObservableCollection<User> _UsersList = new ObservableCollection<User>();
    private readonly Dictionary<string, string> _mapping = new Dictionary<string, string>();


    public MainWindow()
    {

        InitializeComponent();

        _UsersList.Add(new User { Name = "Darl" });

        CollectionViewSource source = this.Resources["source"] as CollectionViewSource;
        source.Source = _UsersList;
        ListBox.SelectionChanged += listbox_SelectionChanged;

现在我想更改它并在用户控件中使用代码,我按以下步骤操作

公共部分类UC:UserControl     {

    private static ModelView ModelViewInstance;

    public Uc()
    {
        InitializeComponent();
        ModelViewInstance = new MappingViewModelView();
        DataContext = ModelViewInstance;
        CollectionViewSource source = this.Resources["source"] as CollectionViewSource;
        source.Source = ModelViewInstance.UserList;

当我运行此程序时,我在source.Source = ModelViewInstance.UserList;

中遇到异常

我需要这段代码,因为当我省略它并运行程序时,我没有例外但是

此代码为用户对象返回null,如果我使用主窗口程序而不是用户控件则不会发生

private void DropText_PreviewDrop(object sender, DragEventArgs e)
{
    var textbox = (TextBox) sender;
    if (!(textbox.Text.Length > 0))
    {
        DataObject data = e.Data as DataObject;
        User user = data.GetData(typeof(User)) as User;
        textbox.Tag = user;

我有另一个类,如模型视图,用户定义为观察者集合,

如何避免此转储?

1 个答案:

答案 0 :(得分:0)

如果您最初在source CollectionViewSource部分宣布了Window.Resources,但未将ResourcesWindow移至UserControl,则您的问题很可能是由对null的{​​{1}}引用引起的。如果是这种情况,请尝试将source CollectionViewSource移至source CollectionViewSource部分并再次运行您的应用程序。


更新&gt;&gt;&gt;

如果您的UserControl.Resources ListBox位于ListBox,则无法通过UserControl与您联系。相反,您需要将MainWindow代码移到后面的listbox_SelectionChanged代码中。但实际上,你仍然做错了。您应该在UserControl中创建DependencyProperty以将集合绑定到; UserControl显示内容,但您仍可以从UserControl添加或删除集合中的项目,因为这是集合所在的位置。