簡體   English   中英

INotifyPropertyChanged未刷新WPF MVVM實體中的列表視圖

[英]INotifyPropertyChanged is not refreshing my listview in WPF MVVM entity

我的視圖模型中有一個動作可將記錄添加到實體框架中,我有一個動作可在視圖中顯示記錄,如下所示:

    private void FillProspects()

    {
        var q = (from a in ctx2.Prospects// 'ctx' is the object of entity 
                 select a).ToList();
        this.Prospects = q;               // 'Porspects' is a collection of   entity class this I have bound with my List view in my view
    }

這將在構建我的視圖模型時調用。結果,我視圖中的列表視圖將顯示記錄。 我在視圖模型中有一個添加記錄操作。.我在視圖模型中創建了與實體類中生成的屬性相對應的屬性,例如:

      private String _FirstName;
      public String FirstName
      {
         get
        {
             return _FirstName;
        }
        set
        {
            _FirstName = value;

        }
     }

我在視圖模型中的添加記錄操作是:

    public void Add1()
    {
        newprospect = new Prospect();
        newprospect.ID = Guid.NewGuid();
        newprospect.FirstName = FirstName;
        newprospect.LastName = LastName;
        newprospect.Address = Address;
        newprospect.State = State;
        newprospect.City = City;
        newprospect.ZIP = ZIP;
        prospect = newprospect;
        ctx2.AddToProspects(prospect);
        FillProspects();
        //RaisePropertyChanged("Prospects");
    }

我繼承了: INotifyPropertyChanged並將其導入

using System.Windows.Input; 
public event PropertyChangedEventHandler PropertyChanged = delegate { };
private void RaisePropertyChanged(string property) { PropertyChanged(this, new PropertyChangedEventArgs(property)); }

但是我的通知沒有在添加記錄后刷新我的視圖Listview記錄。所以我只是在addrecord操作中調用填充記錄方法“ FillProspects”。這是執行MVVM的正確方法。為什么我的Listview在添加記錄操作后沒有得到刷新我想念的地方?我嘗試過RaisePropertyChanged("Prospects"); 在添加記錄操作中...但是它沒有刷新。所以我再次調用了填充方法操作

我完整的視圖模型:

           using System;
       using System.Collections.Generic;
       using System.Linq;
     using System.Text;
      using System.ComponentModel;
     using System.Windows.Input;
     using System.Collections.ObjectModel;

     namespace Wpfentity3
  {
public class frmProspects_VM : INotifyPropertyChanged
{
    TestsEntities ctx2 = new TestsEntities();
    public ObservableCollection<Prospect> prospects { get; set; }
    //This is the collection where records - er, entities - returned by a query are stored; 
    //Prospect is the generated class that defines a record - er,
    //an entity as well as the query for that table.

    private CommandMap _Commands;
    public CommandMap Commands { get { return _Commands; } }   

    Prospect newprospect;
    //This holds a new prospect that is created and then added to the prospects collection
    private Prospect _prospect;
    public Prospect prospect {
                                 get
                                 { 
                                     return _prospect;
                                 } 
                                 set 
                                 { 
                                     _prospect = value;
                                     RaisePropertyChanged("prospect");
                                 }
                              }

    //prospect is the object that holds the current record from the Prospects table.
    //MainWindow  controls are bound to this object


    public frmProspects_VM()
    {
        //FillProspects();
        ctx2 = new TestsEntities();
        //This instantiates the EntityManager class  ;
        prospects = new ObservableCollection<Prospect>();
        //This instantiates the prospects collection of Prospect records - er, entities;

        _Commands = new CommandMap();
        _Commands.AddCommand("Add", x => Add1());
    }

    private ObservableCollection<Prospect> _prospects;
    public ObservableCollection<Prospect> Prospects
   {
      get
      {
        return _prospects;
      }
      set
     {
        _prospects = value;
        RaisePropertyChanged("Prospects");
      }
  }

    private String _FirstName;
    public String FirstName
    {
        get
        {
            return _FirstName;
        }
        set
        {
            _FirstName = value;

        }
    }
    private String _LastName;
    public String LastName
    {
        get
        {
            return _LastName;
        }
        set
        {
            _LastName = value;

        }
    }
    private String _Address;
    public String Address
    {
        get
        {
            return _Address;
        }
        set
        {
            _Address = value;

        }
    }

    private String _State;
    public String State
    {
        get
        {
            return _State;
        }
        set
        {
            _State = value;

        }
    }

    private String _City;
    public String City
    {
        get
        {
            return _City;
        }
        set
        {
            _City = value;

        }
    }
    private String _ZIP;
    public String ZIP
    {
        get
        {
            return _ZIP;
        }
        set
        {
            _ZIP = value;

        }
    }

       public void Add1()
  {

    newprospect = new Prospect();
    newprospect.ID = Guid.NewGuid();
    newprospect.FirstName = FirstName;
    newprospect.LastName = LastName;
    newprospect.Address = Address;
    newprospect.State = State;
    newprospect.City = City;
    newprospect.ZIP = ZIP;

    prospect = newprospect;
    ctx2.AddToProspects(prospect);
    Prospects.Add(newprospect);
    }

   public event PropertyChangedEventHandler PropertyChanged = delegate { };
   private void RaisePropertyChanged(string property) { PropertyChanged(this, new PropertyChangedEventArgs(property)); }
}

}

我的看法xamal:

    <Window x:Class="Wpfentity3.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 WindowStartupLocation="CenterScreen"

   Title="Prospects"
   Height="482" Width="500" MaxWidth="500" MaxHeight="600"
   xmlns:cusns="clr-namespace:Wpfentity3">



    <StackPanel Height="290" VerticalAlignment="Top">
    <StackPanel Orientation="Horizontal" >
        <Label
    Content="Prospects"
    BorderBrush="Blue" BorderThickness="1"
    HorizontalAlignment="Left" VerticalAlignment="Top"
    FontSize="24" FontFamily="Comic Sans MS"
    Padding="13,3,13,9" Margin="5"
       Foreground="Purple" Background="LemonChiffon" />
          <Label 
   Content="{Binding Path=label}" Foreground="Red" FontSize="14"
   HorizontalAlignment="Right" VerticalAlignment="Center" 
   Height="auto" Margin="180,0,10,0" />


    </StackPanel>

    <Grid
  HorizontalAlignment="Left" VerticalAlignment="Top"
  Height="120" Width="475" >
        <Grid.RowDefinitions>
            <RowDefinition Height="25*" />
            <RowDefinition Height="25*" />
            <RowDefinition Height="25*" />
            <RowDefinition Height="25*" />

        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="90*" />
            <ColumnDefinition Width="135*" />
            <ColumnDefinition Width="45*" />
            <ColumnDefinition Width="32*" />
            <ColumnDefinition Width="57*" />
            <ColumnDefinition Width="118*" />
        </Grid.ColumnDefinitions>

        <Label
    Content="First name"
    Grid.Row="0" Grid.Column="0" Margin="0,0,5,0"
    HorizontalAlignment="Right" VerticalAlignment="Center" />
        <TextBox Name="txtFirstName" 
    Grid.Column="1"
    HorizontalAlignment="Left" VerticalAlignment="Center" Text="{Binding Path=FirstName}" 
    Width="130" />

        <Label
    Content="Last name"
    Grid.Row="1" Grid.Column="0" Margin="0,0,5,0"
    HorizontalAlignment="Right" VerticalAlignment="Center" />
        <TextBox  Name="txtLastName"
    Grid.Row="1" Grid.Column="1"
    HorizontalAlignment="Left" VerticalAlignment="Center" Text="{Binding LastName}"
    Width="130" />

        <Label
    Content="Address"
    Grid.Row="2" Grid.Column="0" Margin="0,0,5,0"
    HorizontalAlignment="Right" VerticalAlignment="Center" />
        <TextBox  Name="txtAddress"
    Grid.Row="2" Grid.Column="1"
    HorizontalAlignment="Left" VerticalAlignment="Center" Text="{Binding Address}"
    Width="300" Grid.ColumnSpan="5" />

        <Label
    Content="City"
    Grid.Row="3" Grid.Column="0" Margin="0,0,5,0"
    HorizontalAlignment="Right" VerticalAlignment="Center" />
        <TextBox Name="txtCity"
    Grid.Row="3" Grid.Column="1"
    HorizontalAlignment="Left" VerticalAlignment="Center" Text="{Binding City}"
    Width="130" />

        <Label
    Content="State"
    Grid.Row="3" Grid.Column="2" Margin="0,0,5,0"
    HorizontalAlignment="Right" VerticalAlignment="Center" />
        <TextBox Name="txtState"
    Grid.Row="3" Grid.Column="3" Width="30" MaxLength="2" CharacterCasing="Upper" Text="{Binding State}"
    HorizontalAlignment="Left" VerticalAlignment="Center" />

        <Label
       Content="ZIP code"
    Grid.Row="3" Grid.Column="4" Margin="0,0,5,0"
    HorizontalAlignment="Right" VerticalAlignment="Center" />
        <TextBox Name="txtZIP"
    Grid.Row="3" Grid.Column="5" MaxLength="10"
    HorizontalAlignment="Left" VerticalAlignment="Center" Text="{Binding ZIP}"
    Width="90" />

    </Grid>

    <StackPanel Orientation="Horizontal" Margin="0,10,0,0">

        <Button Name="btnFind"
    Content="_Find"
    Width="auto" Margin="5,0,5,0" Padding="10,0,10,0" />
        <Button Name="btnAdd"
    Content="_Add"  Command="{Binding Commands.Add}"
    Width="auto" Margin="5,0,5,0" Padding="10,0,10,0" />
        <Button Name="btnEdit"
    Content="_Edit"
    Width="auto" Margin="5,0,5,0" Padding="10,0,10,0" />
        <Button Name="btnDelete"
    Content="_Delete"
    Width="auto" Margin="5,0,5,0" Padding="10,0,10,0" />
        <Button Name="btnSave"
    Content="_Save"
    Width="auto" Margin="5,0,5,0" Padding="10,0,10,0" />
        <Button Name="btnCancel"
    Content="_Cancel"
    Width="auto" Margin="5,0,5,0" Padding="10,0,10,0" />
        <Button Name="btnClose"
    Content="Cl_ose"
    Width="auto" Margin="5,0,5,0" Padding="10,0,10,0"
    />



    </StackPanel>

    <StackPanel Height="34" Margin="10">
        <Grid Margin="10">
            <ListView Name="lvprospects" ItemsSource="{Binding Prospects}" Margin="0,0,0,-200">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Header="FirstName" Width="120" DisplayMemberBinding="{Binding  FirstName}" />
                        <GridViewColumn Header="LastName" Width="50" DisplayMemberBinding="{Binding LastName}" />
                        <GridViewColumn Header="Address" Width="50" DisplayMemberBinding="{Binding Address}" />
                        <GridViewColumn Header="City" Width="50" DisplayMemberBinding="{Binding City}" />
                        <GridViewColumn Header="State" Width="50" DisplayMemberBinding="{Binding State}" />
                        <GridViewColumn Header="ZIP" Width="50" DisplayMemberBinding="{Binding ZIP}" />
                    </GridView>
                </ListView.View>
            </ListView>
        </Grid>




    </StackPanel>

</StackPanel>

可以將新項目添加到數據庫,然后使用相同的刷新方法FillProspects再次檢索集合:

您所做的基本上是正確的。

Prospects屬性的類型從List<Prospect>更改為ObservableCollection<Prospect>

private ObservableCollection<Prospect> _prospects = new ObservableCollection<Prospect>();
public ObservableCollection<Prospect> Prospects
{
    get
    {
        return _prospects;
    }
    set
    {
        _prospects = value;
        RaisePropertyChanged("Prospects");
    }
}

並在您的Add1方法中將新的Prospect對象添加到此集合中:

public void Add1()
{

    newprospect = new Prospect();
    newprospect.ID = Guid.NewGuid();
    newprospect.FirstName = FirstName;
    newprospect.LastName = LastName;
    newprospect.Address = Address;
    newprospect.State = State;
    newprospect.City = City;
    newprospect.ZIP = ZIP;

    prospect = newprospect;
    ctx2.AddToProspects(prospect);
    Prospects.Add(newprospect);
}

僅將其添加到DbContext不會影響ListView

如果要將視圖綁定到ViewModel中的集合,則建議使用ObservableCollection。
ObservableCollection實現INotifyCollectionChanged,它在添加或刪除元素時通知視圖。
這樣,您就不需要“ FillProspects”方法和“ RaisePropertyChanged(” Prospects“)”。

如果您想了解更多信息,建議您發布如何綁定到XAML中以及如何構造“前景”對象(我們甚至不知道它是什么類型,我只是假設它不是ObservableCollection)。

編輯:您將ListView綁定到“前景”,但是在您的ViewModel中,我看到“前景”的類型為“列表”,它需要為“ ObservableCollection”。 我看到您有一個名為“ prospects”的ObservableCollection,但是您沒有在任何地方使用它。 這可能是問題嗎?

暫無
暫無

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

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