2017-06-21 133 views
0

在我Resources.xaml(資源詞典),我有一個DataTemplate:TextBox控件以及綁定並沒有更新值時更改屬性

<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> 

,並在我的第一頁我稱之爲的DataTemplate的ContentControl中

在我page1VM,存在包含的屬性繼承的類:

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(); 
     } 
    } 
} 

我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; 
    } 
} 

我的問題是,例如QuantityT值是1,當我點擊減號或加號按鈕時,QuantityT屬性設置爲0或2,但它沒有更新的文本框的值,它仍然顯示1,連我加

UpdateSourceTrigger=PropertyChanged 

感謝,
NicoTing

回答

0

我認爲這個問題是因爲DataTemplate中是ContentDialoag裏面,所以它不能按時更新的價值,因爲當我關閉並重新打開contentdialog,值被改變,所以我所做的是在代碼中修復它背後

謝謝所有響應

0
[CallerMemberName]string propertyName 

不會回到「數量T」。它會返回「SetQuantityT」或「GetQuantityT」(現在可以測試,但類似的東西)。您必須從propertyName中刪除前3個字符。 (我記得有一個類似的問題,這樣才)

而不是

public abstract class BindableBase : IBindable 

使用

public abstract class BindableBase : IBindable, INotifyPropertyChanged

希望幫助

+0

好,我會嘗試添加INotifyPropertyChanged的,但我知道你是什麼意思它會返回「SetQuantityT 「或」GetQu antityT「? – NicoTing

+0

順便說一句,添加INotifyPropertyChanged沒有解決我的問題 – NicoTing

+0

好的。我不確定,但據我記得,[CallerMemberName]字符串propertyName不返回屬性名稱。它返回類似「Set/GetQuantityT」的內容。也許現在有所不同,但你應該試試看。 –

0

我測試你的代碼片段,與添加繼承如下所示INotifyPropertyChanged它將工作良好。

public abstract class BindableBase : INotifyPropertyChanged 

由於您的代碼段是不完整的,我上傳了一個完整的,最小的項目here你可以有一個測試和比較什麼是錯的。如果你仍然有問題,請上傳你最小的複製項目。

而且就在我身邊,結果:

相關問題