2010-12-05 3 views
3

내 WPF 앱에는 TvshowGridView라는 사용자 정의 컨트롤이 포함 된 MainWindow가 있습니다.MVVM : 생성자 args를 UserControl으로 가져 오는 ViewModel 바인딩

MainWindow를 :

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:NevermissClient" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    xmlns:views="clr-namespace:NevermissClient.Views" 
    x:Class="NevermissClient.MainWindow" 
    x:Name="Window"> 
    <Grid x:Name="LayoutRoot"> 
     <views:TvshowGridView x:Name="TheTvshowGridView" Margin="8,8,8,58.96" Grid.Row="1"/> 
    </Grid> 
</Window> 

TvshowGridView :

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:viewModels="clr-namespace:NevermissClient.ViewModels" 
    xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" 
    mc:Ignorable="d" 
    x:Class="NevermissClient.Views.TvshowGridView" 
    d:DesignWidth="640" d:DesignHeight="480"> 

    <Grid x:Name="LayoutRoot"> 

     <telerik:RadGridView x:Name="TvshowGrid" d:LayoutOverrides="Width, Height" AutoGenerateColumns="False" ItemsSource="{Binding AllEpisodes}" IsReadOnly="False"> 
      <telerik:RadGridView.Columns> 
       <telerik:GridViewDataColumn DataMemberBinding="{Binding TvshowName, Mode=TwoWay}" Header="Tvshow Name" IsReadOnly="False"/> 
       <telerik:GridViewDataColumn DataMemberBinding="{Binding Name, Mode=TwoWay}" Header="Episode Name"/> 

       <telerik:GridViewDataColumn DataMemberBinding="{Binding Airdate, Mode=TwoWay}" Header="Airdate"/> 
      </telerik:RadGridView.Columns> 
     </telerik:RadGridView> 

    </Grid> 
</UserControl> 

나는 TvshowGridView에 결합 할 것을 뷰 모델, TvshowGridViewModel는, 인수를 취하는 생성자가 있습니다.

public class TvshowGridViewModel : BaseViewModel 
{ 
    private EpisodeRepository _episodeRepository; 
    private TvshowRepository _tvshowRepository; 

    public ObservableCollection<EpisodeViewModel> AllEpisodes { get; private set; } 

    public TvshowGridViewModel(EpisodeRepository episodeRepository, TvshowRepository tvshowRepository) 
    { 
     _episodeRepository = episodeRepository; 
     _tvshowRepository = tvshowRepository; 

     CreateAllEpisodes(); 
    } 
    ... 
} 

이 인수는 MainWindow에 연결된보기 모델 인 MainWindowViewModel에 정의되어 있습니다. - 그래서 이것은 TvshowGridViewModel을 만들 논리적 인 장소처럼 보입니다.

public class MainWindowViewModel : BaseViewModel 
{ 
    readonly TvshowGridViewModel _tvshowGridViewModel; 
    readonly EpisodeRepository _episodeRepository; 
    readonly TvshowRepository _tvshowRepository; 

    public MainWindowViewModel() 
    { 
     _episodeRepository = new EpisodeRepository("c:\data.xml"); 
     _tvshowRepository = new TvshowRepository("c:\data.xml"); 

     _tvshowGridViewModel = new TvshowGridViewModel(_episodeRepository, _tvshowRepository); 
    } 

    public TvshowGridViewModel TvshowGridViewModel { get; } 
    ... 
} 

어떻게이 TvshowGridView에 인스턴스화 TvshowGridViewModel을 결합 할 수있다? (코드 숨김 방지)

고마워! 당신의 MainWindows 데이터 컨텍스트가 MainWindowViewModel의 인스턴스이라고 가정

답변

3

,이 같은 TvshowGridViewModel하는 UserControl을 바인딩 할 수 있습니다 :

<Window> 
... 
<Grid x:Name="LayoutRoot"> 
    <views:TvshowGridView DataContext={Binding TvshowGridViewModel} x:Name="TheTvshowGridView" Margin="8,8,8,58.96" Grid.Row="1"/> 
</Grid> 

또한 표시와 같은 TvshowGridViewModel 속성 코드를 변경해야합니다 :

public TvshowGridViewModel TvshowGridViewModel 
{ get{return _tvshowGridViewModel;} } 
+0

을 그 매력처럼 일 했어, 고마워! – Lefty

+1

중요한 힌트 : 생성자가있는 ViewModel을 데이터 형식으로 만들 수 없습니다! 물론 예외가 생기면 무엇이 통과 될 수 있습니까? MEFedMVVM과 같은 ViewModelLocator를 사용하여 기본값을 고려한 방법이 있습니다. – msfanboy

관련 문제