2009-10-24 4 views
1

Je cette version simplifiée de mon application en XAML:WPF lier DataContext en XAML à ViewModel dans le code

<UserControl 
     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:uc="clr-namespace:myApp.MyControls"  
     x:Class="myApp.View.MyItem" 
     x:Name="testWind" 
     Width="Auto" Height="Auto" Background="White"> 
    <Grid x:Name="LayoutRoot"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <GroupBox x:Name="GroupBox" Header="G" Grid.Row="0"> 
      <WrapPanel> 
       <GroupBox x:Name="GroupBox11"> 
        <StackPanel Orientation="Vertical"> 
         <uc:customControl1 Margin="0,4,0,0" 
              property1="{Binding prop1.property1}" 
              property2="{Binding prop1.property2}" 
              property3="{Binding prop1.property3}"/> 
         <uc:customControl2 Margin="0,4,0,0" 
              property1="{Binding prop2.property1}" 
              property2="{Binding prop2.property2}" 
              property3="{Binding prop2.property3}"/> 
        </StackPanel> 
       </GroupBox> 
      </WrapPanel> 
     </GroupBox> 
    </Grid> 
</UserControl> 

En C# J'ai ceci:

namespace MyApp.ViewModel 
{ 
    public class MyItemViewModel 
    { 
     public object prop1 { get; set; } 
     public object prop2 { get; set; } 
    } 
} 

Dans MyItem.cs Je le fais :

namespace MyApp.View 
{ 
    public partial class MyItem : UserControl 
    { 
     public MyItem() 
     { 
      this.InitializeComponent(); 
      MyItemViewModel vm = new MyItemViewModel(); 
      vm.prop1 = new blah blah(); // setting properties 
      vm.prop2 = new blah blah(); // setting properties 
      this.DataContext = vm; 
     } 
    } 
} 

Lorsque vous avez trop de contrôles, cela peut devenir difficile à maintenir. Alors, comment puis-je savoir XAML faire quelque chose comme:

<uc:customControl1 Margin="0,4,0,0" DataContext="prop1"/> 
    <uc:customControl2 Margin="0,4,0,0" DataContext="prop2"/> 

Répondre

1

vous pouvez simplement donner chaque contrôle un nom unique

<uc:customControl1 x:Name="mycontrol1" Margin="0,4,0,0" DataContext="prop1"/> 
<uc:customControl2 x:Name="mycontrol2" Margin="0,4,0,0" DataContext="prop2"/> 

puis dans votre code, vous pouvez simplement modifier le contexte des données

mycontrol1.DataContext = vm1; 
    mycontrol2.DataContext = vm2; 
+0

Salut, J'ai essayé cela et cela ne semble pas fonctionner. Comment le DataContext = "prop1" dans XAML se rapporte à mycontrol1.DataContext = vm1 en C# en dehors du nom? Pourquoi définir un nom "prop1" dans XAML, alors qu'en C# c'est vm1? – immuner

+0

@vark, je suivais juste votre exemple. vm1 et vm2 représentent différents contextes de données. –

+0

hey andrew, oui je l'ai compris. Cependant, je ne peux pas faire ce travail. J'ai construit un petit exemple de projet illustrant les deux méthodes ici: http: //www.2shared.com/file/8688933/866fc885/usercustom.html. Y at-il quelque chose que j'ai manqué de votre explication? – immuner

Questions connexes