Observableコレクションにアイテムを追加すると、ListViewが更新されない理由がわかりません。ここ はUIが ObservableCollectionにアイテムを追加してもListViewが変更されない
を追加した後、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コードを生のコードの代わりに使用しています
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));
}
}
のプロパティではありません労働
のコレクションに結合されています'は? – Max
@Maxがメインポストにスクリーンショットを追加しました。 – haosmark
私はしばらくWPFで作業していなかったので、わからないですが、 'DisplayMemberBinding =" {Binding Labor.Time.CheckIn} "'を 'DisplayMemberBinding =" {Labor.Time.CheckIn、Mode = TwoWay 、UpdateSourceTrigger = PropertyChanged} "'?おそらく、これらの新しいプロパティの1つである 'Mode'または' UpdateSourceTrigger'がこれを手伝ってくれます。 – Max