Salut à toutes et à tous,

Soit un UserControl en mvvm.
Le viewmodel du UserControl contient un objet CurrentLot.
Je veux que le UserForm ne soit visible que lorsque le CurrentLot n'est pas null.

Dans le Xaml j'ai donc :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<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:d="http://schemas.microsoft.com/expression/blend/2008" 
             x:Class="LotsApp.View.LotDetailView" 
             mc:Ignorable="d" 
             d:DesignHeight="300" 
             d:DesignWidth="300"
             Visibility="{Binding CurrentLot, Converter={StaticResource NullToVisibilityConverter}}"
             >
    <UserControl.Resources>
        <Style TargetType="{x:Type Border}">
            <Setter Property="BorderThickness" Value="1" />
            <Setter Property="BorderBrush" Value="Black" />
        </Style>
    </UserControl.Resources>
    <UserControl.DataContext>
        <Binding Mode="OneWay" Path="LotDetail" Source="{StaticResource Locator}"/>
    </UserControl.DataContext>
    <UserControl.Style>
        <Style TargetType="{x:Type UserControl}">
            <Setter Property="Cursor" Value="Arrow"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=IsWorking}" Value="True">
                    <Setter Property="Cursor" Value="Wait"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </UserControl.Style>
        <Grid>
              ...
       </Grid>
</UserControl>
Le convertisseur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    public class NullToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            Visibility visibility = Visibility.Visible;
            if (value == null || value is DBNull)
            {
                if ((string)parameter == "Invert")
                    visibility = Visibility.Visible;
                else
                    visibility = Visibility.Collapsed;
            }
            else
            {
                if ((string)parameter == "Invert")
                    visibility = Visibility.Collapsed;
                else
                    visibility = Visibility.Visible;
            }
            return visibility;
        }
 
 
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return null;
        }
    }
Le viewmodel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class LotDetailViewModel : AppViewModelBase
    {
        private Lot _currentLot;
        public Lot CurrentLot
        {
            get { return _currentLot; }
            set
            {
                if (_currentLot != value)
                {
                    _currentLot = value;
                    RaisePropertyChanged(() => CurrentLot);
                }
            }
        }
 
 
        public ICommand RafraichirLotCommand { get; private set; }
 
 
        public LotDetailViewModel()
        {
            Messenger.Default.Register<string>(this, "NoLot", noLot => ChangeNoLot(noLot));
            RafraichirLotCommand = new RelayCommand(() => ChangeNoLot(this.CurrentLot.NoLot));
        }
 
 
        private void ChangeNoLot(string noLot)
        {
            IsWorking = true;
            CurrentLot = new Lot(noLot);
            IsWorking = false;
        }
    }
Ce UserControl doit donner le détail d'un lot lorsque le lot est sélectionné dans une liste qui se trouve dans un autre UserControl. Le numéro du lot étant transféré d'un UserControl à l'autre via le messenger de MVVM light.

Le tout fonctionne bien, mais seulement lors du 2ème passage.
Je veux dire que lorsque, dans le premier UserForm, je sélectionne pour la première fois un lot dans la liste, le messenger passe bien le numéro du lot. Dans le viewmodel, ChangeNoLot passe bien aussi, le CurrentLot est bien mis à jour et le RaisePropertyChanged(() => CurrentLot); passe aussi. Pourtant le UserForm reste invisible.
Lorsque je sélectionne un autre lot dans le premier UserForm, tout passe à nouveau, et là le UserForm passe à Visible.

Autre constat que j'ai fait : Si j'enlève la ligne de la visibilité dans le Xaml, je constate que, toujours lors de la première sélection, tous les champs restent vides. Ils ne se remplissent que lors de la sélection du second lot dans le premier UserForm (après, toute sélection dans le premier UserForm se répercute effectivement sur le second).

Je ne comprend pas pourquoi, lors du premier passage, le CurrentLot semble reste null aux "yeux" du xaml alors que dans le viewmodel tout semble se passer comme il faut.

Qu'est-ce que je fais mal ?
Pourquoi le passage du CurrentLot de null à "rempli" ne se répercute pas sur le Xaml alors qu'après, le passage d'un lot à un autre se répercute bien sur le xaml ?

Merci de vos z'avis z'avisés,
JM