- Akio,
Bonjour à tous !
Je me suis très récemment mis à coder sur un projet en C# avec WPF et je rencontre un petit souci. Je dispose d’une fenêtre tout ce qu’il y a de plus simple qui contient en gros : deux DockPanels, dont un qui contient un StackPanel de ToggleButton auxquels j’ai appliqué tant bien que mal un style qui me convient. Ces Boutons ont des propriétés Command qui font partie d’une tentative d’implémentation du patern MVVM.
Jusque là tout marche comme je le souhaite, les boutons me permettent de lier les UserControls à un ContentControl de la fenêtre. Mon seul problème (du moins celui que je vois moi, je rappelle que je suis nouveau à tout ça, le code que je vais mettre en dessous fera pet être pleurer quelques personnes :/), c’est que quand je passe d’une vue à l’autre, mon programme "oublie" le contenu de la vue précédente.
J’ai par exemple placé une CheckBox un peu au hasard sur la page, si je la coche, change de vue et reviens sur la première, la CheckBox se retrouve décochée ><.
Voici des extraits du code, je suis preneur de tout conseil même si ça ne concerne pas directement mon problème
Le XAML de la fenêtre (hmm pas de coloration spécifique, j’espère que XML fera l’affaire :/)
<Window x:Name="W_Acc" x:Class="Fil_Hub.W_Main"
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:local="clr-namespace:Fil_Hub"
xmlns:utils="clr-namespace:Fil_Hub.Utilitaires"
xmlns:views="clr-namespace:Fil_Hub.Views"
xmlns:models="clr-namespace:Fil_Hub.Models"
mc:Ignorable="d"
Title="Fil'Hub" Height="800" Width="1080"
Background="Gainsboro" WindowStartupLocation="CenterScreen" WindowStyle="None" Foreground="White"
ResizeMode="NoResize"
MouseDown="W_Acc_MouseDown">
<Window.DataContext>
<models:NavigationViewModel/>
</Window.DataContext>
<Window.Resources>
#-- (...)
#-- Des styles, et storyboard qui ne devrait pas poser problème
<DataTemplate DataType="{x:Type models:DashBoardViewModel}">
<views:DashBoard/>
</DataTemplate>
<DataTemplate DataType="{x:Type models:PlanViewModel}">
<views:Planning/>
</DataTemplate>
</Window.Resources>
<Grid Background="Gainsboro">
#-- (...)
#-- Un premier DockPanel qui n'est pas concerné
<DockPanel x:Name="G_Menu" Width="210" HorizontalAlignment="Left">
<DockPanel.Background>
<SolidColorBrush Color="{DynamicResource BleuCobalt}"/>
</DockPanel.Background>
#-- (...)
#-- un autre DockPanel non concerné
<StackPanel DockPanel.Dock="Top" Orientation="Vertical" Width="210">
<ToggleButton x:Name="B_DashBoard" Height="50" Style="{StaticResource MenuTButton_S}"
utils:ImageSetter.ImagePath="{StaticResource Dash_Image}" BorderThickness="0" Click="B_DashBoard_Click"
Command="{Binding DashCommand}">Tableau de Bord</ToggleButton>
<ToggleButton x:Name="B_EnCours" Height="50" Style="{StaticResource MenuTButton_S}"
utils:ImageSetter.ImagePath="{StaticResource Aff_Image}" BorderThickness="0" Click="B_EnCours_Click">Affaires en cours</ToggleButton>
<ToggleButton x:Name="B_Planning" Height="50" Style="{StaticResource MenuTButton_S}"
utils:ImageSetter.ImagePath="{StaticResource Plan_Image}" BorderThickness="0" Click="B_Planning_Click"
Command="{Binding PlanCommand}">Planings</ToggleButton>
<ToggleButton x:Name="B_Trait" Height="50" Style="{StaticResource MenuTButton_S}"
utils:ImageSetter.ImagePath="{StaticResource Trait_Image}" BorderThickness="0" Click="B_Trait_Click">Traitement de résultats</ToggleButton>
<ToggleButton x:Name="B_Repport" Height="50" Style="{StaticResource MenuTButton_S}"
utils:ImageSetter.ImagePath="{StaticResource Word_Image}" BorderThickness="0" Click="B_Repport_Click">Rapports Word</ToggleButton>
</StackPanel>
</DockPanel>
<ContentControl Margin="210,86,0,0" Content="{Binding SelectedViewModel, Mode=TwoWay}"/>
</Grid>
</Window>
Le code behind de ce XAML ne contiens rien de passionant.Avant de m’attaquer à tous les UserControls, je voulais m’assurer que tout fonctionne, il n’y a donc que 2 boutton avec une propriété Command.
Voici le code de la classe NavigationViewModel qui est placé dans Window.DataContext :
namespace Fil_Hub.Models
{
class NavigationViewModel : ViewModelBase
{
public ICommand DashCommand { get; set; }
public ICommand PlanCommand { get; set; }
private object selectedViewModel;
public object SelectedViewModel
{
get { return selectedViewModel; }
set { SetProperty(ref selectedViewModel, value, "SelectedViewModel"); }
}
//private readonly Dictionary<string, object> views;
private DashBoardViewModel _dbv = new DashBoardViewModel();
private PlanViewModel _plan = new PlanViewModel();
public NavigationViewModel()
{
/*views = new Dictionary<string, object>
{
["DashBoard"] = new DashBoardViewModel(),
["Planning"] = new PlanViewModel()
};*/
DashCommand = new BaseCommand(OpenDash);
PlanCommand = new BaseCommand(OpenPlan);
}
private void OpenDash(object obj)
{
SelectedViewModel = _dbv;//views["DashBoard"];
}
private void OpenPlan(object obj)
{
SelectedViewModel = _plan;//views["Planning"];
}
}
}
Cette classe hérite de :
namespace Fil_Hub.Models
{
// mise en place du pattern MVVM, classe de base pour les ViewModels
public abstract class ViewModelBase : INotifyPropertyChanged
{
//implémentation de INPC
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
}
//Fonction set pour les propriété qui apelleront l'event PropertyChanged => Lève l'event si la propriétée est changée et renvoie true, sinon renvoie false
protected virtual bool SetProperty<T>(ref T propStock, T propNouv, [CallerMemberName] string propName = "")
{
if (EqualityComparer<T>.Default.Equals(propStock, propNouv))
return false;
propStock = propNouv;
this.OnPropertyChanged(propName);
return true;
}
}
}
Mes deux classes ViewModel sont vides :
namespace Fil_Hub.Models
{
class DashBoardViewModel : ViewModelBase
{
}
}
Ainsi que les Vues qui ne contiennent pas grands chose pour mes essais :
```xml
<UserControl x:Class="Fil_Hub.Views.Planning"
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"
xmlns:local="clr-namespace:Fil_Hub"
xmlns:utils="clr-namespace:Fil_Hub.Utilitaires"
xmlns:views="clr-namespace:Fil_Hub.Views"
xmlns:models="clr-namespace:Fil_Hub.Models"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<CheckBox Content="CheckBox" HorizontalAlignment="Left" Margin="709,137,0,0" VerticalAlignment="Top"/>
<ComboBox HorizontalAlignment="Left" Margin="268,276,0,0" VerticalAlignment="Top" Width="120"/>
</Grid>
</UserControl>
Je vais continuer à chercher en attendant vos réponses, si jamais je me débloque tout seul, je vous fais signe
Merci !