2014-11-16 143 views
1

所以問題是,無論我做什麼改變我的文本框中的文本都不會更改代碼中的屬性,儘管我將它綁定了它。 我使用MVVM模式這樣: 我的模型:WPF綁定不更新數據

public class Shipment 
{ 
    public Shipment() {} 

    public int ShipmentId {get;set;} 

    //LP and Payer 
    [Required] 
    public long ExternalNumber {get ; set;} 
    public long MPKNumber { get; set; } 
    public long ContractNumber { get; set; } 
    public Payer Payer { get; set; } 
    public Payment Payment { get; set; } 
    //And much more but i'm working on these right now 
} 

我的視圖模型:

public class PrepareNewViewModel : INotifyPropertyChanged 
{ 
    private Shipment shipment { get; set; } 

    public Shipment Shipment 
    { 
     get 
     { 
      return shipment; 
     } 
     set 
     { 
      if (shipment != value) 
      { 
       shipment = value; 
       RaisePropertyChanged("Shipment"); 
      } 
     } 
    } 

    public PrepareNewViewModel() 
    { 
     Shipment = new Shipment(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void RaisePropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

而我的觀點:

<Page 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:Controls ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit" 
     xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" 
     x:Class="SmartShipping.Views.Pages.PrepeareNew" 
     xmlns:local ="clr-namespace:SmartShipping.ViewModels" 
     xmlns:System="clr-namespace:System;assembly=mscorlib" 
     xmlns:Model ="clr-namespace:SmartShipping.Model" 
     mc:Ignorable="d" 
     d:DesignHeight="889" d:DesignWidth="959" 
     Title="PrepeareNew"> 

    <Page.DataContext> 
     <local:PrepareNewViewModel/> 
    </Page.DataContext> 

    <Page.Resources> 
     <ObjectDataProvider x:Key="dataFromEnumPayer" MethodName="GetValues" ObjectType="{x:Type System:Enum}"> 
      <ObjectDataProvider.MethodParameters> 
       <x:Type TypeName="Model:Payer"/> 
      </ObjectDataProvider.MethodParameters> 
     </ObjectDataProvider> 

     <ObjectDataProvider x:Key="dataFromEnumPayment" MethodName="GetValues" ObjectType="{x:Type System:Enum}"> 
      <ObjectDataProvider.MethodParameters> 
       <x:Type TypeName="Model:Payment"/> 
      </ObjectDataProvider.MethodParameters> 
     </ObjectDataProvider> 
    </Page.Resources> 

    <GroupBox Header="LIST PRZEWOZOWY I PŁATNIK" HorizontalAlignment="Left" 
       VerticalAlignment="Top" Margin="10,131,0,0" Height="146" Width="458"> 
     <Grid HorizontalAlignment="Left" Width="448" Margin="0,0,-2,0"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="28*"/> 
       <ColumnDefinition Width="28*"/> 
       <ColumnDefinition Width="56*"/> 
      </Grid.ColumnDefinitions> 

      <Label Content="Nr zewnętrzny:" HorizontalAlignment="Left" 
        VerticalAlignment="Top" Margin="10,8,0,0" Width="138" Grid.ColumnSpan="2"/> 
      <TextBox Height="24" Margin="10,31,10,0" TextWrapping="Wrap" 
        Text="{Binding Shipment.ExternalNumber, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
        VerticalAlignment="Top" Grid.ColumnSpan="2"/> 

      <Label Content="Nr MPK:" HorizontalAlignment="Left" VerticalAlignment="Top" 
        Margin="0,10,0,0" Grid.Column="2" Width="73"/> 
      <TextBox Height="24" Margin="0,31,10,0" TextWrapping="Wrap" 
        Text="{Binding Shipment.MPKNumber, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" 
        VerticalAlignment="Top" Grid.Column="2" 
        Background="{DynamicResource {x:Static SystemColors.ControlLightLightBrushKey}}"/> 

      <Label Content="Płatnik usługi:" HorizontalAlignment="Left" 
        VerticalAlignment="Top" Margin="10,69,0,0"/> 
      <ComboBox ItemsSource="{Binding Source={StaticResource dataFromEnumPayer}}" 
         Margin="10,92,0,0" VerticalAlignment="Top" Height="24" 
         Background="{DynamicResource {x:Static SystemColors.ControlLightLightBrushKey}}"/> 

      <Label Content="Forma płatności:" HorizontalAlignment="Left" 
        VerticalAlignment="Top" Margin="5,69,0,0" Grid.Column="1"/> 
      <ComboBox SelectedItem="{Binding Shipment.Payment}" 
         ItemsSource="{Binding Source={StaticResource dataFromEnumPayment}}" 
         Margin="10,92,10,0" VerticalAlignment="Top" Height="24" 
         Background="{DynamicResource {x:Static SystemColors.ControlLightLightBrushKey}}" 
         Grid.Column="1"/> 

      <Label Content="Nr umowy:" HorizontalAlignment="Left" 
        VerticalAlignment="Top" Margin="0,66,0,0" Grid.Column="2"/> 
      <TextBox HorizontalAlignment="Left" Height="24" 
        Margin="0,92,0,0" TextWrapping="Wrap" 
        VerticalAlignment="Top" Width="214" Grid.Column="2" 
        Text="{Binding Shipment.ContractNumber, ValidatesOnDataErrors=True}"/> 
     </Grid> 
    </GroupBox> 
</Page> 

難道說我不綁定模型的每個屬性?

+0

您的Shipment.ExternalNumber屬性在屬性上引發了更改嗎? – overloading

+0

不,但正如您看到整個Shipment屬性所做的那樣。我將嘗試添加它並查看是否有幫助 – SebOlens

+0

打開高級跟蹤和調試。診斷:PresentationTraceSources.TraceLevel =「高」它應該顯示任何綁定錯誤。 – Paparazzi

回答

1

MVVM的經驗法則是ViewModel和View有一對一的關係。如果您對每個貨件都有屬性,那對我來說更有意義。否則,貨件的成員將不會更新。儘管直觀上貨件在技術上發生了變化,但只有在更新其價值時纔會更新屬性 - 而不是其成員。

您的文本框在技術上只能綁定一種方式。當您更改它們時,裝運的成員不會更新。我很好奇,如果這是可能的,所以我在我正在進行的一個項目中對自己進行了測試,並且確實足以改變我的Model的成員沒有處理RaisePropertyChanged。