Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 添加新项目后如何刷新视图_C#_.net_Wpf - Fatal编程技术网

C# 添加新项目后如何刷新视图

C# 添加新项目后如何刷新视图,c#,.net,wpf,C#,.net,Wpf,我有这个问题,因为如果我在observablecollection中添加新项,我在视图中看不到结果。 我需要重新启动,然后才能看到新项目 这是我的viewmodel,我在其中显示项目 public class ManageFleetListingViewModel : ViewModelBase { private readonly Func<IEnumerable<DisplayManageFleetViewModel>,IEnumerable<DisplayM

我有这个问题,因为如果我在observablecollection中添加新项,我在视图中看不到结果。 我需要重新启动,然后才能看到新项目

这是我的viewmodel,我在其中显示项目

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();
    }
这是我的userconrol(ManageFleetListing)xaml,我在其中显示项目

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

下面是公认的答案,但正如你从评论中看到的,我的陈述是不真实的


您必须绑定到一个
可观测集合
,控件才能订阅对集合的更改。在本例中,您绑定到
IEnumerable
,因此该控件从此列表中填充一次。控件从未看到支持
IEnumerable
ObservableCollection
的更改

public IEnumerable Vehicles=>\u manageFleetViewModel;
只需将此更改为

公共可观测采集车辆=>\u manageFleetViewModel;
或者更好的办法是去掉
\u manageFleetViewModel
字段并更改
车辆

公共可观测收集车辆{get;}

然后使用
车辆
而不是代码中的
\u manageFleetViewModel

“我在我的observablecollection中添加了新项目”-哪个
observablecollection
?您没有显示足够的源:没有属性,没有xaml。我们仍然不知道什么是
Vehicles
,它是在哪个视图模型类中声明的,该类如何连接到视图,以及如何将元素添加到视图中。
ItemsSource=“{Binding Vehicles}”
在UserControl的xaml中,它是否直接绑定到视图模型属性,或者Vehicles在此是UserControl的属性?事实并非如此-只要backing字段实现了
INotifyCollectionChanged
,绑定控件就会检测到这一点。不知道为什么会接受,但解释是错误的。您可以很好地将
可观测集合
作为
IEnumerable
类型的属性公开,就像问题中的代码那样。绑定项控件将执行运行时检查ItemsSource对象是否实现INotifyCollectionChanged。@Peregrine:我刚刚做了一个简单的测试,您是正确的。我敢肯定,当集合隐藏在一个接口后面时,我已经看到了这个问题,也许这个答案确实帮助解决了这个问题。但是,我会删除它,因为它通常是错误的。嗯,我不能删除它,因为它是公认的答案。。。
            Account account = await _manageFleetService.AddVehicle(carBrand, vin, milage, engineCapacity, engineCapacity, registerNumber, firstRegistration, yearPurchase, yearProduction, imageCar, _accountStore.CurrentAccount);

            _manageFleetListingViewModel.AddItem();
<Grid>
    <StackPanel HorizontalAlignment="Center">
        <ItemsControl ItemsSource="{Binding Vehicles}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Task:VehcileTask/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </StackPanel>
</Grid>
    <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>
<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>
    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));
        }
    }