簡體   English   中英

添加新項目后如何刷新視圖

[英]How refresh view after added new item

我有問題,因為如果我在我的 observablecollection 中添加新項目,我在我的視圖中看不到結果。 我需要重新啟動,然后才能看到新項目。

這是我顯示項目的視圖模型

public class ManageFleetListingViewModel : ViewModelBase
{
    private readonly Func<IEnumerable<DisplayManageFleetViewModel>,IEnumerable<DisplayManageFleetViewModel>> _filtersVehicle;
    private readonly ObservableCollection<DisplayManageFleetViewModel> _manageFleetViewModel;
    private readonly VehicleState _vehicleState;
    private readonly IManageFleetService _manageFleetService;

    public IEnumerable<DisplayManageFleetViewModel> Vehicles => _manageFleetViewModel;

    public ICommand DeleteVehicleCommand { get; set; }


    public ManageFleetListingViewModel(VehicleState vehicleState, IManageFleetService manageFleetService) : this(vehicleState,manageFleetService, manageFleet => manageFleet) { }

    public ManageFleetListingViewModel(VehicleState vehicleState, IManageFleetService manageFleetService, Func<IEnumerable<DisplayManageFleetViewModel>, IEnumerable<DisplayManageFleetViewModel>> filtersVehicle )
    {
        DeleteVehicleCommand = new DeleteVehicleCommand(this, manageFleetService);
        _filtersVehicle = filtersVehicle;
        _vehicleState = vehicleState;
        _manageFleetViewModel = new ObservableCollection<DisplayManageFleetViewModel>();

        _vehicleState.StateChanged += VehicleState_StateChanged;
        DisplayVehicles();
    }
    
    public void DeleteItem(int id)
    {
        var item = Vehicles.FirstOrDefault(x => x.Id == id);
        _manageFleetViewModel.Remove(item);
    }

    public void AddItem()
    {
        DisplayVehicles();
    }

    private void DisplayVehicles()
    {
        IEnumerable<DisplayManageFleetViewModel> displayManageFleets = _vehicleState.GetVehicles
            .Select(s => new DisplayManageFleetViewModel(s.Id, s.CarBrand, s.VIN, s.Milage, s.EnigneNumber, s.EngineCapacity, s.RegistrationNumber, s.FirstRegistration, s.YearPurchase, s.YearProduction, s.ImageCar));

         displayManageFleets = _filtersVehicle(displayManageFleets);

        _manageFleetViewModel.Clear();
        foreach (DisplayManageFleetViewModel viewModel in displayManageFleets)
        {
            _manageFleetViewModel.Add(viewModel);
        }
    }
   

    private void VehicleState_StateChanged()
    {
        DisplayVehicles();
    }

這是我添加項目的項目域

public class ManageFleetService : IManageFleetService
{
    private readonly IDataService<Account> _accountService;
    private readonly IVehicleService _vehicleService;

    public ManageFleetService(IDataService<Account> accountService, IVehicleService vehicleService)
    {
        _accountService = accountService;
        _vehicleService = vehicleService;
    }
    public async  Task<Account> AddVehicle(string carBrand, string vin, string milage, string engineNumber, string engineCapacity, string registerNumber, DateTime firstRegistration, DateTime yearPurchase, DateTime yearProduction, byte[] imageCar,Account accountId)
    {
        Vehicle vehicleVIN = await _vehicleService.GetByVIN(vin);
        if(vehicleVIN != null)
        {
            throw new InvalidVinNumberException(vin);
        }
        Vehicle vehicleRegistraion = await _vehicleService.GetByRegistrationNumber(registerNumber);
        if(vehicleRegistraion != null)
        {
            throw new InvalidRegistrationNumberException(registerNumber);
        }
        Vehicle vehicle = new Vehicle()
        {
            CarBrand = carBrand,
            VIN = vin,
            Milage = milage,
            EnigneNumber = engineNumber,
            EngineCapacity = engineCapacity,
            RegistrationNumber = registerNumber,
            FirstRegistration = firstRegistration,
            YearPurchase = yearPurchase,
            YearProduction = yearProduction,
            ImageCar = imageCar,
            Account = accountId
        };
        accountId.Vehciles = new List<Vehicle>();
        accountId.Vehciles.Add(vehicle);
        await _accountService.Update(accountId, accountId.Id);

        return accountId;
    }

將項目添加到數據庫后,我將在下一次顯示命令中的 DisplayVehicles 函數

            Account account = await _manageFleetService.AddVehicle(carBrand, vin, milage, engineCapacity, engineCapacity, registerNumber, firstRegistration, yearPurchase, yearProduction, imageCar, _accountStore.CurrentAccount);

            _manageFleetListingViewModel.AddItem();

這是我的 userconrol (ManageFleetListing) xaml,我在其中顯示項目

<Grid>
    <StackPanel HorizontalAlignment="Center">
        <ItemsControl ItemsSource="{Binding Vehicles}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Task:VehcileTask/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </StackPanel>
</Grid>

這是我的 VehicleTask 模式

    <StackPanel>
    <Border>
        
    </Border>
    <StackPanel Orientation="Horizontal">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto"/>
                <ColumnDefinition Width="auto"/>
                <ColumnDefinition Width="auto"/>
                <ColumnDefinition Width="auto"/>
            </Grid.ColumnDefinitions>
        </Grid>
        <StackPanel Grid.Column="0" MinWidth="150" MaxWidth="300">
            <TextBlock Text="{Binding CarBrand}" FontSize="12" FontWeight="DemiBold"/>
        </StackPanel>
        <StackPanel Grid.Column="1"  MinWidth="150" MaxWidth="300">
            <TextBlock Text="{Binding VIN}" FontSize="12" FontWeight="DemiBold"/>
        </StackPanel>
        <StackPanel Grid.Column="2" MinWidth="100" MaxWidth="200">
            <TextBlock Text="{Binding Milage}" FontSize="12" FontWeight="DemiBold"/>
        </StackPanel>
        <StackPanel Grid.Column="3"  MinWidth="100" MaxWidth="200" Margin="0 0 20 0">
            <TextBlock Text="{Binding YearProduction, StringFormat='dd/MM/yyyy'}" FontSize="12" FontWeight="DemiBold"/>
        </StackPanel>
        <Button Content="Edit" Command="{Binding Path=DataContext.DeleteVehicleommand, RelativeSource={RelativeSource AncestorType=local:ManageFleetListing}}"/>
        <Button Background="Red" BorderThickness="0" Content="Delete" Command="{Binding Path=DataContext.DeleteVehicleCommand, RelativeSource={RelativeSource AncestorType=local:ManageFleetListing}}" Margin="10 0 0 0" CommandParameter="{Binding Id}"/>
    </StackPanel>
    
    <Border BorderThickness="1" Background="Black"></Border>
</StackPanel>

這是這里的主要視圖,我使用 CreateVehicleCommandand 並顯示 ManageFleetListing

<Button
            Command="{Binding CreateVehicleCommand}"
            Style="{DynamicResource InventoryButton}" Height="50" Width="200" HorizontalAlignment="Left" Margin="40 20 0 0">
            <Button.Background>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="#FF5DFF00"/>
                    <GradientStop Color="White" Offset="1"/>
                </LinearGradientBrush>
            </Button.Background>
            <Button.Content>
                <TextBlock Text="Add" FontSize="20" FontWeight="Bold" Foreground="Gray"/>
            </Button.Content>
        </Button>
        <Grid Grid.Row="5" Height="200" Margin="0 10 0 0">
        <ManageFleet:ManageFleetListing DataContext="{Binding ManageFleetListingViewModel}"/>
    </Grid>

這是上面 xaml 的視圖模型

    public class ManageFleetViewModel : ViewModelBase
{
    public ICommand CreateVehicleCommand { get; set; }
    public ManageFleetListingViewModel ManageFleetListingViewModel { get; }

    public ManageFleetViewModel(IManageFleetService menageFleetService, IAccountStore accountStore,VehicleState vehicleState, IManageFleetService manageFleetService,ManageFleetListingViewModel manageFleetListingViewModel)
    {
        CreateVehicleCommand = new CreateVehicleCommand(this, menageFleetService, accountStore, manageFleetListingViewModel);
        ManageFleetListingViewModel = new ManageFleetListingViewModel(vehicleState,manageFleetService);
    }

    private string _carbrand { get; set; } //if is problem with added to database look here
    private string _vin { get; set; }
    private string _milage { get; set; }
    private string _enigneNumber { get; set; }
    private string _engineCapacity { get; set; }
    private string _registrationNumber { get; set; }
    private DateTime _firstRegistration { get; set; }
    private DateTime _yearPurchase { get; set; }
    private DateTime _yearProduction { get; set; }
    private byte [] _imageCar { get; set; }

    public string CarBrand
    { 
        get
        {
            return _carbrand;
        }
        set
        {
            _carbrand = value;
            OnPropertyChanged(nameof(CarBrand));
        }
    }
    public string VIN
    {
        get 
        {
            return _vin;
        }
        set
        {
            _vin = value;
            OnPropertyChanged(nameof(VIN));
        }
    }
    public string Milage
    {
        get
        {
            return _milage;
        }
        set
        {
            _milage = value;
            OnPropertyChanged(nameof(Milage));
        }
    }
    public string EnigneNumber
    { 
        get
        {
            return _enigneNumber;
        }
        set
        {
            _enigneNumber = value;
            OnPropertyChanged(nameof(EnigneNumber));
        }
    }
    public string EngineCapacity
    {
        get
        {
            return _engineCapacity;
        }
        set
        {
            _engineCapacity = value;
            OnPropertyChanged(nameof(EngineCapacity));
        }
    }
    public string RegistrationNumber
    { 
        get
        {
            return _registrationNumber;
        }
        set
        {
            _registrationNumber = value;
            OnPropertyChanged(nameof(RegistrationNumber));
        }
    }
    public DateTime FirstRegistration
    {
        get
        {
            if(_firstRegistration.Year == 1) { return DateTime.Now; }
            return _firstRegistration;

        }
        set
        {
            _firstRegistration = value;
            OnPropertyChanged(nameof(FirstRegistration));
        }
    }
    public DateTime YearPurchase
    {
        get
        {
            if(_yearPurchase.Year == 1) { return DateTime.Now; }
            return _yearPurchase;
        }
        set
        {
            _yearPurchase = value;
            OnPropertyChanged(nameof(YearPurchase));
        }
    }
    public DateTime YearProduction
    {
        get
        {
            if (_yearProduction.Year == 1) { return DateTime.Now; }
            return _yearProduction;
        }
        set
        {
            _yearProduction = value;
            OnPropertyChanged(nameof(YearProduction));
        }
    }
    public byte [] ImageCar
    {
        get
        {
            return _imageCar;
        }
        set
        {
            _imageCar = value;
            OnPropertyChanged(nameof(ImageCar));
        }
    }

以下是已接受的答案,但正如您從評論中看到的那樣,我的陳述是不正確的。


您必須綁定到ObservableCollection<T>以使控件訂閱對集合的更改。 在您的情況下,您綁定到IEnumerable<T>以便從此列表中填充控件一次。 控件永遠不會看到對支持IEnumerable<T>ObservableCollection<T>更改。

public IEnumerable<DisplayManageFleetViewModel> Vehicles => _manageFleetViewModel;

只需將其更改為

public ObservableCollection<DisplayManageFleetViewModel> Vehicles => _manageFleetViewModel;

或者甚至更好地擺脫_manageFleetViewModel字段並更改Vehicles

public ObservableCollection<DisplayManageFleetViewModel> Vehicles { get; }

然后在您的代碼中使用Vehicles而不是_manageFleetViewModel

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM