2016-08-30 1 views
0

Observableコレクションにアイテムを追加すると、ListViewが更新されない理由がわかりません。ここ はUIが enter image description hereObservableCollectionにアイテムを追加してもListViewが変更されない

として始まり、ここで私が何らかの理由でアイテム enter image description here

を追加した後、ListViewコントロールがしかし、作業指示を拾い、またチェックイン日されていないように見えるものだ何ですそれは

... TechCountを更新しない。ここListViewのコードです:

<ListView Grid.Row="2" 
     ItemsSource="{Binding LaborItems}"  
     SelectedItem="{Binding SelectedLaborItem}" 
     Margin="10,10,10,9"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="#" Width="55" DisplayMemberBinding="{Binding Labor.WorkOrderNo}"/> 
      <GridViewColumn Header="Date" Width="100" DisplayMemberBinding="{Binding Labor.Time.CheckIn}"/> 
      <GridViewColumn Header="Techs" DisplayMemberBinding="{Binding TechCount}" /> 
     </GridView> 
    </ListView.View> 
</ListView> 

それはrelevanを参照する方が簡単ですtコードを生のコードの代わりに使用しています enter image description here

Line 26は、UIの+ボタンをクリックすると実行されるものです。 TechCountには、Labor内のフィールドを参照するCheckInと同様の実装があります。

ここで完全なのviewmodelコードです:私は、+ボタンをクリックした後

public class ServiceItemsViewModel : ViewModelBase 
{ 
    public Labor Labor { get; set; } 
    public ObservableCollection<Labor> LaborItems { get; private set; } = new ObservableCollection<Labor>(); 

public ServiceItemsViewModel() 
{ 
    Labor = new Labor(); 
    Labor.Rates = new LaborRatesDual(); 
    AddLaborCommand = new DelegateCommand(addLabor, null); 
} 

public ICommand AddLaborCommand { get; private set; } 

private void addLabor(object obj) 
{ 
    LaborItems.Add(Labor); 
    Labor = new Labor(); 
} 

private bool canAddLabor(object arg) 
{ 
    if (Labor.Duration.Minutes < 1) 
    { 
     return false; 
    } 

    //if (AdditionalBillingRate <= 0 || AdditionalPayoutRate <= 0) 
    //{ 
    // return false; 
    //} 

    return true; 
} 

public DateTime CheckIn 
{ 
    get { return Labor.Time.CheckIn; } 
    set 
    { 
     Labor.Time.CheckIn = value; 
     RaisePropertyChanged(nameof(Labor)); 
    } 
} 
public DateTime CheckOut 
{ 
    get { return Labor.Time.CheckOut; } 
    set 
    { 
     Labor.Time.CheckOut = value; 
     RaisePropertyChanged(nameof(Labor)); 
     ((DelegateCommand)AddLaborCommand).RaiseCanExecuteChanged(); 
    } 
} 
public int TechCount 
{ 
    get { return Labor.TechCount; } 
    set 
    { 
     Labor.TechCount = value; 
     RaisePropertyChanged(nameof(Labor)); 
    } 
} 
public decimal InitialPayoutRate 
{ 
    get { return Labor.Rates.InitialPayoutRate; } 
    set 
    { 
     Labor.Rates.InitialPayoutRate = value; 
     RaisePropertyChanged(nameof(Labor)); 
     //((DelegateCommand)AddLaborCommand).RaiseCanExecuteChanged(); 
    } 
} 
public decimal AdditionalPayoutRate 
{ 
    get { return Labor.Rates.AdditionalPayoutRate; } 
    set 
    { 
     Labor.Rates.AdditionalPayoutRate = value; 
     RaisePropertyChanged(nameof(Labor)); 
     //((DelegateCommand)AddLaborCommand).RaiseCanExecuteChanged(); 
    } 
} 
public decimal InitialBillingRate 
{ 
    get { return Labor.Rates.InitialBillingRate; } 
    set 
    { 
     Labor.Rates.InitialBillingRate = value; 
     RaisePropertyChanged(nameof(Labor)); 
     //((DelegateCommand)AddLaborCommand).RaiseCanExecuteChanged(); 
    } 
} 
public decimal AdditionalBillingRate 
{ 
    get { return Labor.Rates.AdditionalBillingRate; } 
    set 
    { 
     Labor.Rates.AdditionalBillingRate = value; 
     RaisePropertyChanged(nameof(Labor)); 
     //((DelegateCommand)AddLaborCommand).RaiseCanExecuteChanged(); 
    } 
} 

private Labor selectedLaborItem; 
public Labor SelectedLaborItem 
{ 
    get { return selectedLaborItem; } 
    set 
    { 
     selectedLaborItem = value; 
     RaisePropertyChanged(nameof(Labor)); 
    } 
} 

労働内容: enter image description here

+0

のプロパティではありません労働

のコレクション
ItemsSource="{Binding LaborItems}" 

に結合されています'は? – Max

+0

@Maxがメインポストにスクリーンショットを追加しました。 – haosmark

+0

私はしばらくWPFで作業していなかったので、わからないですが、 'DisplayMemberBinding =" {Binding Labor.Time.CheckIn} "'を 'DisplayMemberBinding =" {Labor.Time.CheckIn、Mode = TwoWay 、UpdateSourceTrigger = PropertyChanged} "'?おそらく、これらの新しいプロパティの1つである 'Mode'または' UpdateSourceTrigger'がこれを手伝ってくれます。 – Max

答えて

0

あなたの列バインドは間違っている:

<GridViewColumn Header="#" Width="55" DisplayMemberBinding="{Binding **Labor.**WorkOrderNo}"/> 
<GridViewColumn Header="Date" Width="100" DisplayMemberBinding="{Binding **Labor.**Time.CheckIn}"/> 
<GridViewColumn Header="Techs" DisplayMemberBinding="{Binding TechCount}" /> 

は、上記*印を付した領域を参照してください。

0

あなたは既に労働を使用して、行26にブレークポイントを入れて、どのような `労働の内容を教えてもらえ労働

<GridViewColumn Header="#" Width="55" DisplayMemberBinding="{Binding WorkOrderNo}"/> 
<GridViewColumn Header="Date" Width="100" DisplayMemberBinding="{Binding Time.CheckIn}"/> 
関連する問題