2017-06-21 4 views
0
geändert wird

Auf meinem Resources.xaml (Resource Dictionary) Ich habe eine Datatemplate:TextBox mit Datenbindung ist nicht Wert zu aktualisieren, wenn Eigenschaft

<DataTemplate x:Key="ProductDetailsContentTemplate"> 
<StackPanel Orientation="Vertical" > 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="25*"/> 
      <ColumnDefinition Width="50*"/> 
      <ColumnDefinition Width="25*"/> 
     </Grid.ColumnDefinitions> 
      <Button x:Name="SubtractQytyButton" Grid.Column="0" Content="-" FontSize="24" HorizontalAlignment="Stretch" Command="{Binding SubtractQuantityCommand}" 
         Margin="5,0" Style="{StaticResource ButtonStyle}" FontWeight="ExtraBold" /> 
      <TextBox x:Name="QuantityTextBox" Grid.Column="1" HorizontalAlignment="Stretch" FontSize="24" Margin="5,0" 
         KeyDown="Quantity_Keydown" TextChanging="Quantity_TextChanging" TextChanged="QuantityTextBox_TextChanged" 
         Text="{Binding QuantityT, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" MaxLength="5" TextAlignment="Center"/> 
      <Button x:Name="AddQytyButton" Grid.Column="2" Content="+" FontSize="24" HorizontalAlignment="Stretch" Command="{Binding AddQuantityCommand}" /> 
    </Grid> 
</StackPanel> 

und auf meinem Seite1 nenne ich Datatemplate auf ein Content

auf meinem page1VM, gibt es eine vererbte Klasse, die Eigenschaften enthalten:

public class Class1 : BindableBase 
{ 
    private Model _model; 
    public Class1(Model model) { 
     _model = model; 

     _quantityT = model.Quantity.ToString(); 

     SubtractQuantityCommand = new DelegateCommand(SubtractQuantity, CanSubtract); 
     AddQuantityCommand = new DelegateCommand(AddQuantity, CanAdd); 
    } 
    public DelegateCommand SubtractQuantityCommand { get; } 
    public DelegateCommand AddQuantityCommand { get; } 

    private bool CanAdd() { 
     return int.Parse(QuantityT) < 99999; 
    } 
    private void AddQuantity() { 
     QuantityT = (int.Parse(QuantityT) + 1).ToString(); 
    } 

    private bool CanSubtract() { 
     return int.Parse(QuantityT) > 0; 
    } 
    private void SubtractQuantity() { 
     QuantityT = (int.Parse(QuantityT) - 1).ToString(); 
    } 

    private void InvalidateCommands() { 
     (AddQuantityCommand as DelegateCommand)?.RaiseCanExecuteChanged(); 
     (SubtractQuantityCommand as DelegateCommand)?.RaiseCanExecuteChanged(); 
    } 

    private string _quantityT; 
    public string QuantityT { 
     get { return _quantityT; } 
     set { this.Set(ref _quantityT, value); 
      InvalidateCommands(); 
     } 
    } 
} 

mein BindableBase:

public abstract class BindableBase : IBindable 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void RaisePropertyChanged([CallerMemberName]string propertyName = null) 
    { 
     if (Windows.ApplicationModel.DesignMode.DesignModeEnabled) 
      return; 

     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    protected virtual bool Set<T>(ref T storage, T value, [CallerMemberName]string propertyName = null) 
    { 
     if (object.Equals(storage, value)) 
      return false; 
     storage = value; 
     RaisePropertyChanged(propertyName); 
     return true; 
    } 
} 

Mein Problem ist, beispielsweise der QuantityT Wert 1 ist, wenn ich die Minus- oder Plus-Taste klicken, wird die QuantityT Eigenschaft auf 0 oder 2 ist, aber es ist nicht die Aktualisierung der Textbox Wert eingestellt ist, seine noch 1 Anzeige, auch habe ich

UpdateSourceTrigger=PropertyChanged 

Danke,
NicoTing

Antwort

0

ich glaube, das Problem ist, weil das Datatemplate im Innern des ContentDialoag ist, so dass ich nicht den Wert rechtzeitig zu aktualisieren, denn wenn wir schließen und erneut öffnen contentdialog, wird der Wert geändert, so was ich tat, ist es hinter in Code beheben

danke für alle Antwort

0
[CallerMemberName]string propertyName 

Will not return Menge“ T ". Es wird "SetQuantityT" oder "GetQuantityT" zurückgegeben (Kann es jetzt testen, aber so etwas). Sie müssen die ersten 3 Zeichen aus dem propertyName entfernen. (Ich erinnere mich, ein ähnliches Problem, wie dies vor)

Statt

public abstract class BindableBase : IBindable 

Verwendung

public abstract class BindableBase : IBindable, INotifyPropertyChanged

Hoffnung, die

+0

Ok ich werde versuchen, INotifyPropertyChanged hinzuzufügen, kann aber ich weiß, was meinst du es zurück „SetQuantityT "oder" GetQu antityT "? – NicoTing

+0

btw Hinzufügen von INotifyPropertyChanged hat mein Problem nicht gelöst – NicoTing

+0

ok. Ich weiß es nicht genau, aber soweit ich mich erinnere, gibt [StringMerkName] string propertyName nicht nur den Namen der Eigenschaft zurück. Es gibt etwas wie "Set/GetQuantityT" zurück. Vielleicht ist es jetzt anders, aber du solltest es versuchen. –

0

hilft ich Ihren Code-Snippet getestet, mit inherit Hinzufügen INotifyPropertyChanged wie folgt wird es gut funktionieren.

public abstract class BindableBase : INotifyPropertyChanged 

Da Ihr Code-Schnipsel sind nicht die komplette, ich hochgeladen ein komplettes, minimal Projekt here Sie eine Test haben kann und zu vergleichen, was falsch ist. Und wenn Sie immer noch Probleme haben, laden Sie bitte Ihr minimales Reproduktionsprojekt hoch.

Und das Ergebnis auf meiner Seite:

Verwandte Themen