J'ai fait un exemple de projet de démonstration VS 2010 RC, parce que dans mon projet de production j'ai la même erreur en utilisant MVVM.ContentTemplateSelector est seulement appelé une fois montrant toujours le même datatemplate
Dans mon exemple de projet de démonstration que j'utilise uniquement le code-behind sans dépendances 3ème partie afin que vous pouvez télécharger le projet de démonstration ici et l'exécuter pour vous-même: http://www.sendspace.com/file/mwx7wv
maintenant au problème: Lorsque je clique sur les filles/garçons bouton il devrait changer le datatemplate, pas?
Qu'est-ce que je me trompe?
OK Je propose ici un extrait de code trop:
code-behind MainWindow.cs:
namespace ContentTemplateSelectorDemo
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
Person person;
public MainWindow()
{
InitializeComponent();
person = new Person(){ Gender = "xxx"};
person.IsBoy = true;
ContentGrid.DataContext = person;
}
private void btnBoys_Click(object sender, RoutedEventArgs e)
{
person.IsBoy = true;
person.IsGirl = false;
this.ContentGrid.DataContext = person;
}
private void btnGirls_Click(object sender, RoutedEventArgs e)
{
person.IsGirl = true;
person.IsBoy = false;
this.ContentGrid.DataContext = person;
}
}
}
XAML MainWindow.xaml:
<Window x:Class="ContentTemplateSelectorDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ContentTemplateSelectorDemo"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate x:Key="girlsViewTemplate">
<local:UserControl1 />
</DataTemplate>
<DataTemplate x:Key="boysViewTemplate" >
<local:UserControl2 />
</DataTemplate>
<local:PersonDataTemplateSelector x:Key="PersonSelector" />
</Window.Resources>
<Grid x:Name="ContentGrid" >
<StackPanel>
<Button Name="btnGirls" Click="btnGirls_Click">Switch Girls</Button>
<Button Name="btnBoys" Click="btnBoys_Click">Switch Boys</Button>
<ContentControl Content="{Binding}" ContentTemplateSelector="{StaticResource ResourceKey=PersonSelector}" />
</StackPanel>
</Grid>
</Window>
classe DataTemplateSelector :
public class PersonDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item,DependencyObject container)
{
if (item is Person)
{
Person person = item as Person;
Window window = Application.Current.MainWindow;
if (System.ComponentModel.DesignerProperties.GetIsInDesignMode(window))
return null;
if (person.IsBoy)
return window.FindResource("boysViewTemplate") as DataTemplate;
if (person.IsGirl)
return window.FindResource("girlsViewTemplate") as DataTemplate;
}
return null;
}
}
:)
meilleurs extraits de code postal au lieu d'offrir un téléchargement , les gens ne vont probablement pas télécharger tha t. –
ok édité mon article de départ! – msfanboy
ok après quelques recherches: http://joshsmithonwpf.wordpress.com/2007/03/18/updating-the-ui-when-binding-directly-to-business-objects-that-are-modified/ comme josh dit dans ses commentaires de code: "... Ceci est nécessaire parce que le système de liaison WPF ignorera une notification \t \t \t // PropertyChanged si la propriété retourne la même référence d'objet que précédemment ..." Je ne dois pas retourner le même objet à la place je dois recréer l'objet Person dans le eventhandler de boutons comme: ... = new Personne() {IsBoy = vrai, IsGirl = faux} etc ... alors ça marche. merci josh! – msfanboy