Привязка из MVVM к View не работает в Prism - PullRequest
1 голос
/ 09 марта 2012

Я новичок в Prism, но я успешно создал несколько приложений WPF / Mvvm-Light.Я использую первую модель ViewModel для каждой пары View / ViewModel.Все представления загружаются и деактивируются при открытии приложения.Представления активируются в результате отлова агрегированного события, нацеленного на них.Это первое представление, которое я пытался привязать к данным в ViewModel.Представление отображается должным образом, за исключением того, что мой список никогда не заполняется.Видна только схема списка.Если я изменю цвет фона списка, цвет пустого списка изменится.Свойство ViewModel имеет восемь строк, но ни одна из них не видна.Я могу отображать элементы в жестком коде в списке.Я знаю, что модель представления загружается в представление как контекст данных, так как другой текстовый блок может связываться со свойством ViewModel. Это должно быть что-то сломанное в моем списке xaml.Вот некоторые xaml для обзора:

  <UserControl
     x:Class="DxStudioSelect.View.DxStudioFindView"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
  >
     <UserControl.Resources>
        <DataTemplate x:Key="DxStudioListTemplate">
           <TextBlock Text="{Binding Path=FriendlyForkName}"/>
        </DataTemplate>
     </UserControl.Resources>
     <Grid>
        <Grid.ColumnDefinitions>
           <ColumnDefinition Width="*"/>
           <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <ListBox
           Grid.Column="0"
           ItemsSource="{Binding DatabaseInstanceList}"
           ItemTemplate="{StaticResource DxStudioListTemplate}"
        />
        <TextBlock Text="{Binding Path=PageName}" Grid.Column="1" FontSize="32" Foreground="Green" TextAlignment="Right"/>
     </Grid>
  </UserControl>

Вот код позади:

  public partial class DxStudioFindView : UserControl, IDxStudioFindView {
     public DxStudioFindView() {
        InitializeComponent();
     }

     public IViewModel ViewModel {
        get { return (IDxStudioFindViewModel)DataContext; }
        set { DataContext = value; }
     }
  }

Вот ViewModel:

  private readonly IEventAggregator _eventAggregator;
  private readonly IUnityContainer _unityContainer;
  private readonly IRegionManager _regionManager;
  private readonly string _dxStudioDatabaseName;
  private readonly HeaderUpdatePayload _headerUpdatePayload = new HeaderUpdatePayload("DxStudio", "Select DxStudio Instance");

  public DxStudioFindViewModel(IUnityContainer unityContainer, IRegionManager regionManager, IEventAggregator eventAggregator, IDxStudioFindView view)
     : base(view) {
     _unityContainer = unityContainer;
     _regionManager = regionManager;
     _eventAggregator = eventAggregator;
     View.ViewModel = this;

     if(IsInDesignMode) {

        //Design-time, so show fake data
        DesignTimeDataLoad();
     } else {

        //Run-time, so do the real stuff
        DesignTimeDataLoad();
        _dxStudioDatabaseName = LiteralString.DxStudioDatabaseNameTest;

        _eventAggregator.GetEvent<ViewChangeRequestEvent>().Subscribe(DxStudioInstanceChangeRequest, ThreadOption.UIThread, false, target => target.TargetView == LiteralString.DxStudioFind);
     }
  }


  public string PageName { get; set; }
  //public string PageName { get { return "Find DxStudio Instance"; } }

  private ObservableCollection<IDxStudioInstanceDto> _dxStudioInstanceList = null;
  public ObservableCollection<IDxStudioInstanceDto> DxStudioInstanceList {
     get { return _dxStudioInstanceList; }
     set {
        _dxStudioInstanceList = value;
        OnPropertyChanged("DxStudioInstanceList");
     }
  }

  private void DxStudioInstanceChangeRequest(ViewChangeRequestPayload payload) {
     var region = _regionManager.Regions[RegionNames.Content];
     region.Activate(View);

     _eventAggregator.GetEvent<ViewChangedHeaderEvent>().Publish(_headerUpdatePayload);

     var footerUpdatePayload = new FooterUpdatePayload(FooterDisplayMode.DxStudioSelect, _dxStudioDatabaseName, payload.TargetBackDatabase, payload.TargetBack, string.Empty, LiteralString.ToolboxStart);
     _eventAggregator.GetEvent<ViewChangedFooterEvent>().Publish(footerUpdatePayload);
  }

  private void DesignTimeDataLoad() {
     PageName = "Find DxStudio Instance";
     DxStudioInstanceList = new ObservableCollection<IDxStudioInstanceDto>() {
        new DxStudioInstanceDto("Instance1"),
        new DxStudioInstanceDto("Instance2"),
        new DxStudioInstanceDto("Instance3"),
        new DxStudioInstanceDto("Instance4"),
        new DxStudioInstanceDto("Instance5"),
        new DxStudioInstanceDto("Instance6"),
        new DxStudioInstanceDto("Instance7"),
        new DxStudioInstanceDto("Instance8"),
     };
  }

А вотобъект передачи данных:

public class DxStudioInstanceDto : IDxStudioInstanceDto {
  public string FriendlyForkName { get; private set; }

  public DxStudioInstanceDto(string friendlyForkName) { FriendlyForkName = friendlyForkName; }
}

Поскольку у меня совершенно нет идей, любое предложение будет полезным.Спасибо

1 Ответ

1 голос
/ 09 марта 2012

Ваш список привязан к ItemsSource="{Binding DatabaseInstanceList}", но ваша модель просмотра имеет свойство DxStudioInstanceList.

...