2017-09-06 2 views
0

J'ai une zone de texte liée à un curseur.Le curseur ne met pas à jour la valeur maximale

<TextBox Text="{Binding ElementName=maxValue, Path=Value, UpdateSourceTrigger=LostFocus}" TextAlignment="Center" VerticalContentAlignment="Center" Width="30" Height="25" BorderBrush="Transparent" PreviewKeyDown="TextBox_PreviewKeyDown"></TextBox> 
<Slider Value="{Binding TotalSize}" Maximum="{Binding MaxMaxBackupSize, Mode=TwoWay}" Minimum="{Binding MinBackupSize}" TickPlacement="BottomRight" TickFrequency="2" IsSnapToTickEnabled="True" Name="maxValue"></Slider> 

Une fois qu'un utilisateur choisit quelque chose, je recalculer le maximum (MaxMaxBackupSize), car il est une propriété binded, cela devrait mettre à jour la zone de texte et le curseur, mais, pour une raison - que la valeur de zone de texte est changée, et s'il était plus élevé que le maximum, il est abaissé au maximum. Le curseur semble toutefois être laissée intacte, et je peux encore le déplacer comme je le souhaite (et cela modifie également le texte dans la zone de texte ...

je les propriétés pertinentes suivantes:

private int totalSize; 

public int TotalSize 
{ 
    get { return totalSize; } 
    set 
    { 
     if (value == totalSize) 
      return; 

     totalSize = value; 
     ConfigChanged = true; 
     ChangeIni = true; 
    } 
} 

public static int MaxMaxBackupSize { get; set; } 
public static int MinBackupSize { get; set; } 

Les changement qui se fait après l'utilisateur presse un levier est:

... 
MaxMaxBackupSize = Convert.ToInt16(f/1000000000) 
TotalSize = (TotalSize < MaxMaxBackupSize) ? TotalSize : MaxMaxBackupSize; 
... 

UPDATE0: (BTW, je suis sur un paquet NuGet appelé Fody.OnPropertyChanged qui me sauve la nécessité d'augmenter OnPropertyChanged - si ce n'est pas la raison)

MISE À JOUR: Je devrais être clair sur ce que je dis quand je veux dire que le curseur ne change pas - le curseur décale, mais la valeur maximum du curseur reste l'ancienne valeur maximum. Dites si avant la valeur maximale était de 50, et maintenant ses 20, si le curseur était précédemment sur 30 alors il passera à 20, mais je vais toujours avoir la possibilité de le déplacer jusqu'à 50. Je veux que le maximum soit plafonné à 20 Je ne sais pas si c'est possible ou pas.

MAJ2: pour l'instant je trouve une solution de contournement, pour vérifier si la valeur est plus grande que le maximum dans la propriété, et s'il affiche une boîte de message indiquant qu'il est impossible, et les retours.

+0

S'il vous plaît fournir une prise en pension minimale lorsque vous posez une question sur le SO: https://stackoverflow.com/help/mcve – mm8

+0

Qu'est-ce qui manque? Peut-être que le changement que je fais après que l'utilisateur ait choisi quelque chose ... Je l'ajouterai. –

+0

@Sameed Lire le post - J'utilise un paquet spécial qui les implémente pour moi, et ça fonctionne parfaitement. Ce n'est pas le problème. –

Répondre

1

Le problème semble être les propriétés statiques, comme NotifyPropertyChanged ne peut être appelée sur une instance, afin de le faire fonctionner vous devez le mettre en œuvre en tant que membre statique, avec un accesseur non statique comme

private static int _maxBackupSize; 
public int MaxBackupSize 
{ 
    get { return _maxBackupSize; } 
    set { _maxBackupSize = value; <However your Framework raises the Event> } 
} 

maintenant vous pouvez avoir une variable statique avec un accesseur non statique qui peut déclencher l'événement NotifyPropertyChanged