2010-10-22 18 views
4

J'ai créé un simple projet MVVM wpf. L'idée de base est d'afficher des données sur le revenu annuel d'un client et les prêts qu'il a avec différentes banques.WPF Listbox avec usercontrol en tant que ItemTemplate DataTemplate Binding Problème

Le modèle se compose de 2 classes, Financial et FinancialLoans. Le ViewModel se compose de 2 classes FinancialVM et FinancialLoanVM

Voici les classes VM:

namespace WpfTester.ViewModel{ 
public class FinancialVM 
{ 
    public Model.Financial Financial { get; set; } 

    public ObservableCollection<ViewModel.FinancialLoanVM> FinancialLoanVMs { get; set; } 

    public FinancialVM() 
    { 
     //Fill the models with some sample data 
     Financial = new WpfTester.Model.Financial { Income = 1950.12 }; 
     Financial.FinancialLoans = new ObservableCollection<Model.FinancialLoan>(); 
     Financial.FinancialLoans.Add(new WpfTester.Model.FinancialLoan { Bank = new Random().Next().ToString() }); 
     Financial.FinancialLoans.Add(new WpfTester.Model.FinancialLoan { Bank = new Random().Next().ToString() }); 

     FinancialLoanVMs = new ObservableCollection<FinancialLoanVM>(); 

     foreach (Model.FinancialLoan financialLoan in Financial.FinancialLoans) 
     { 
      FinancialLoanVMs.Add(new ViewModel.FinancialLoanVM { FinancialLoan = financialLoan }); 
     } 
    } } 




public class FinancialLoanVM 
{ 
    public Model.FinancialLoan FinancialLoan { get; set; } 

    public FinancialLoanVM() 
    { FinancialLoan = new Model.FinancialLoan(); } 


} 

}

L'interface utilisateur a un à Pilotage utilisateur financier avec ses datacontext liés à l'FinancialVM et un utilisateur FinancialLoan contrôle avec le datacontext lié au FinancialLoanVM.

Le problème est le visage, est avec la Listbox. Je l'ai modélisé pour que les contrôles utilisateur de FinancialLoans soient des éléments, mais les données liées ne sont pas injectées dans le DataContext de FinancialLoanUC. Je suppose que l'astuce est dans la partie du datatemplate listboxitem. Des idées de comment je peux faire ce travail?

<UserControl.DataContext> 
    <ViewModel:FinancialVM/> 
</UserControl.DataContext> 

<Grid d:DataContext="{d:DesignInstance Type=ViewModel:FinancialVM}" > 

    <Grid.RowDefinitions> 
     <RowDefinition Height="23"/> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 
    <StackPanel Grid.Row="0" Orientation="Horizontal"> 
     <TextBlock Text="Income= "/> 
     <Label Content="{Binding Path=Financial.Income}"/> 
    </StackPanel> 
    <ListBox Grid.Row="1" ItemsSource="{Binding Path=FinancialLoanVMs}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <View:FinancialLoanUC DataContext="{Binding }" /> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

Répondre

4

En réponse à ma question, j'ai trouvé ce qui n'allait pas. Le FinancialLoanUC avait ceci dans le XAML:

<UserControl.DataContext> 
    <ViewModel:FinancialLoanVM/> 
</UserControl.DataContext> 

qui l'emportaient sur le DataContext Injecté du FinancialUC. (Je suppose que ce qui se passe est que DataContext a été mis de l'organe FinancialLoanVM de la collection observable, puis elle a été remplacée par une nouvelle instance de classe comme décrit dans le XAML)

(adoptée par le demandeur)