Почему загрузка MEF Lazy не работает во ViewModel? - PullRequest
0 голосов
/ 31 января 2012

Я пытаюсь заставить Ленивого работать для коллекции в моей ViewModel, к которой я привязываюсь.Коллекция прекрасно загружается через MEF, но никогда не отображается в связанном пользовательском интерфейсе.

Вот пользовательский интерфейс:

<Window x:Class="TestWindow"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

     <StackPanel>
          <ItemsControl ItemsSource="{Binding MyList}">
               <ItemsControl.ItemTemplate>
                    <DataTemplate>
                         <Label Content="{Binding ItemTitle}" />
                    </DataTemplate>
               </ItemsControl.ItemTemplate>
          </ItemsControl>
     <StackPanel>
</Window>

Класс code-behind:

public partial class TestWindow : Window
{
     public TestWindow()
     {
          InitializeComponent();
          this.DataContext = new TestVM();
     }
}

ViewModel:

public class TestVM : INotifyPropertyChanged, IPartImportsSatisfiedNotification
{
     public TestVM()
     {
          //I'm using a static class to initiate the import
          CompositionInitializer.SatisfyImports(this);
     }

     public event PropertyChangedEventHandler PropertyChanged = delegate { };

     [ImportMany(typeof(MyItemBase))]
     public Lazy<MyItemBase>[] MyList { get; set; }

     public void OnImportsSatisfied()
     {
          this.PropertyChanged(this, new PropertyChangedEventArgs("MyList"));
     }
}

Базовый класс для элементов и некоторые унаследованные тестовые классы:

[InheritedExport]
public class MyItemBase
{
    public MyItemBase()
    {

    }

    public string ItemTitle{ get; set; }
}

public class MyItem1: MyItemBase
{
    public MyItem1()
    {
        this.ItemTitle = "Item 1";
    }
}

public class MyItem2: MyItemBase
{
    public MyItem2()
    {
        this.ItemTitle = "Item 2";
    }
}

Это работает, ЕСЛИ я просто удаляю загрузку Lazy.Однако позже мне потребуется применить некоторые атрибуты экспорта, что означает переход на Lazy.

1 Ответ

2 голосов
/ 31 января 2012

проблема в том, что вы хотите связать со списком объекта MyItembase, но ваша фактическая привязка - это ленивый массив объектов MyItembase (если вы никогда не вызываете .Value для вашего ленивого элемента, ничего не произойдет)

В моих проектах я использую приватную ленивую коллекцию для mef и обычную коллекцию ObservableCollection для wpf. Кстати, я бы предпочел инжектор конструктора для вашего импорта Mef

public class TestVM : INotifyPropertyChanged, IPartImportsSatisfiedNotification
{
 public TestVM()
 {
      //I'm using a static class to initiate the import
      CompositionInitializer.SatisfyImports(this);

      this.MyList = new ObservableCollection();
      foreach(var lazyitem in _mefList)
      {
          this.MyList.Add(lazyitem.Value);
      }
 }

 public event PropertyChangedEventHandler PropertyChanged = delegate { };

 public ObservbableCollection<MyItemBase> MyList{ get; set; }

 [ImportMany(typeof(MyItemBase))]
 private IEnumarable<Lazy<MyItemBase>> _mefList { get; set; }

 public void OnImportsSatisfied()
 {
      //this.PropertyChanged(this, new PropertyChangedEventArgs("MyList"));
 }

}

...