簡體   English   中英

WPF綁定DataGrid不更新

[英]WPF Binding DataGrid Not Updating

我做錯了什么? 我只是試圖將返回的List加載到網格視圖中(順便說一句,如果您不介意的話,是否還可以給我一些提示,以在三層體系結構中正確應用INotifyPropertyChanged)

標記:

<Grid Margin="10">
    <DataGrid Name="PatientDataGrid" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Id" Binding="{Binding Id}" />
            <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}" />
            <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" />
            <DataGridTextColumn Header="Middle Name" Binding="{Binding MiddleName}" />
            <DataGridCheckBoxColumn Header="Status" Binding="{Binding StatusId}" />
        </DataGrid.Columns>  
    </DataGrid>
</Grid>

我的MainWindow代碼背后:

public partial class MainWindow : Window
{
    PatientMgr koko   = new PatientMgr();
    public MainWindow()
    {
        InitializeComponent();

        koko.Entity.Id = 0;
        koko.EntityList = koko.RetrieveMany(koko.Entity);

        DataContext = koko.EntityList;
    }
}

我的基類:

public class Patient
{
    public int Id { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public bool StatusId { get; set; }

}

我的DataAccessLayer:

public class PatientDb
{
    public Patient Retrieve(Patient parameters)
    {
        Patient item = new Patient();
        try
        {
            var readDb = new PatientDb();
            item = readDb.RetrieveMany(parameters).Single();
        }
        catch (Exception)
        {
        }

        return item;
    }

    public List<Patient> RetrieveMany(Patient parameters)
    {
        var items = new List<Patient>();

        var command = new SqlCommand();

        command.CommandText = "RetrievePatients";
        command.CommandType = CommandType.StoredProcedure;

        command.Parameters.AddWithValue("@Id", parameters.Id).Direction = ParameterDirection.Input;
        command.Parameters.AddWithValue("@LastName", parameters.LastName).Direction = ParameterDirection.Input;
        command.Parameters.AddWithValue("@FirstName", parameters.FirstName).Direction = ParameterDirection.Input;
        command.Parameters.AddWithValue("@MiddleName", parameters.MiddleName).Direction = ParameterDirection.Input;

        DataTable dt = SqlHelper.GetData(command);

        foreach (DataRow row in dt.Rows)
        {
            var item = new Patient();

            item.Id = TDefaultValue.GetInt(row["Id"].ToString());

            item.LastName = TDefaultValue.GetString(row["LastName"].ToString());
            item.FirstName = TDefaultValue.GetString(row["FirstName"].ToString());
            item.MiddleName = TDefaultValue.GetString(row["MiddleName"].ToString());

            items.Add(item);

            items.Add(item);
        }

        return items;
    }
}

我的BusinessLogicLayer

public class PatientMgr : INotifyPropertyChanged
{
    private readonly PatientDb _db;
    private Patient _entity;
    private List<Patient> _entityList;

    public Patient Entity
    {
        get { return _entity; }
        set
        {
            if (Equals(value, _entity)) return;
            _entity = value;
            OnPropertyChanged();
        }
    }

    public List<Patient> EntityList
    {
        get { return _entityList; }
        set
        {
            if (Equals(value, _entityList)) return;
            _entityList = value;
            OnPropertyChanged();
        }
    }

    public PatientMgr()
    {
        _db = new PatientDb();
        Entity = new Patient();
        EntityList = new List<Patient>();
    }

    public Patient Retrieve(Patient parameters)
    {
        return _db.Retrieve(parameters);
    }

    public List<Patient> RetrieveMany(Patient parameters)
    {
        return _db.RetrieveMany(parameters);
    }


    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

此外,這些代碼是否有標記快捷方式? BTW,SqlHelper和TDefaultValue工作正常。 SqlHelper包含ConnectionString及其相關的任何內容,而TDefaultValue是用於將對象解析/覆蓋為不同數據類型的靜態類,以防萬一您想詢問

我會將您的代碼更改為

   <Grid Margin="10">
        <DataGrid ItemsSource="{Binding EntityList}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Id" Binding="{Binding Id}" />
                <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}" />
                <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" />
                <DataGridTextColumn Header="Middle Name" Binding="{Binding MiddleName}" />
                <DataGridCheckBoxColumn Header="Status" Binding="{Binding StatusId}" />
            </DataGrid.Columns>

        </DataGrid>
    </Grid>

view.cs

public partial class MainWindow : Window
{
    PatientMgr koko   = new PatientMgr();
    public MainWindow()
    {
        InitializeComponent();


        koko.Entity.Id = 0;
        koko.EntityList = koko.RetrieveMany(koko.Entity);

        DataContext = koko;
    }
}

暫無
暫無

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

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