2012-03-08 69 views
1

我是新來的棱鏡,但我已經成功地建立了幾個WPF/Mvvm光應用程序。我爲每個View/ViewModel對使用ViewModel-first instaciation。視圖在應用程序打開時全部加載並取消激活。由於捕獲針對它們的聚合事件,視圖被激活。這是我試圖綁定到ViewModel中的數據的第一個視圖。該視圖按預期顯示,但我的列表框永遠不會填充。只有列表框的輪廓可見。如果我更改列表框的背景顏色,空列表框的顏色會改變。 ViewModel屬性有八行,但都不可見。我可以在列表框中顯示硬編碼項目。我知道視圖模型作爲數據上下文加載到視圖中,因爲另一個文本塊可以綁定到ViewModel屬性它必須是在我的列表框xaml中打破的東西。下面是一些XAML回顧:從MVVM綁定到視圖不在棱鏡

<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; } 
    } 
    } 

這裏是視圖模型:

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; } 
} 

因爲我是comp從頭到尾,任何建議都會有所幫助。 感謝

回答

1

您的列表結合ItemsSource="{Binding DatabaseInstanceList}"但您的視圖模型的財產DxStudioInstanceList

+0

Thwuuupppp ... [手部擊中額頭的聲音。]感謝您爲我發現。有時候森林阻礙了樹木的觀察。 – JimBoone 2012-03-08 22:23:09