gpt4 book ai didi

c# - ListView 仅显示空行。 WPF MVVM

转载 作者:行者123 更新时间:2023-11-30 18:27:02 25 4
gpt4 key购买 nike

我正在尝试将 sqlite 数据表绑定(bind)到 ListView 。问题是它在数据库中显示正确的行数,但显示为空行。因此,如果数据计数为五,它会显示五个空数据行。下面是我的整个解决方案的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.Text.RegularExpressions;
using System.Data;
using System.Data.SQLite;
using WpfApplication_tutorial.Properties;

namespace WpfApplication_tutorial.Model
{
public class Student : IDataErrorInfo
{

public Student(string firstName, string lastName)
{
this.FirstName = firstName;
this.LastName = lastName;
}

private Student() { }

public string FirstName
{
get;
set;
}

public string LastName
{
get;
set;
}

string IDataErrorInfo.Error { get { return null; } }

string IDataErrorInfo.this[string propertyName]
{
get { return this.GetValidationError(propertyName); }
}

public bool IsValid
{
get
{
foreach (string property in ValidatedProperties)
if (GetValidationError(property) != null)
return false;
return true;
}
}

static readonly string[] ValidatedProperties =
{
"FirstName",
"LastName"
};

string GetValidationError(string propertyName)
{
if (Array.IndexOf(ValidatedProperties, propertyName) < 0)
return null;

string error = null;

switch (propertyName)
{
case "FirstName":
error = this.ValidateFirstName();
break;

case "LastName":
error = this.ValidateLastName();
break;

default:
Debug.Fail("Unknown property being validated on Student", propertyName);
break;
}
return error;
}

string ValidateFirstName()
{
if (IsStringMissing(this.FirstName))
{
return Strings.Student_MissingFirstName_Error;
}
return null;
}

string ValidateLastName()
{
if (IsStringMissing(this.LastName))
{
return Strings.Student_MissingLastName_Error;
}
return null;
}

static bool IsStringMissing(string value)
{
return
String.IsNullOrEmpty(value) || value.Trim() == String.Empty;
}
}

}

下面是我的 View 模型的代码。它包括创建和从表中选择的功能

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Diagnostics;
using System.Threading;
using System.Security;
using System.Windows;
using System.Windows.Input;
using System.IO;
using System.Data;
using System.Data.SQLite;
using System.Windows.Media;
using System.Windows.Media.Animation;
using GalaSoft.MvvmLight;
using WpfApplication_tutorial.Model;
using WpfApplication_tutorial.View;
using WpfApplication_tutorial.UserControls;

namespace WpfApplication_tutorial.ViewModel
{
public class StudentViewModel : ViewModelBase, IDataErrorInfo
{
readonly Student _student;
private string firstName = string.Empty;
private string lastName = string.Empty;
private DataView studentDetails = null;


// Command for registering new student
private ICommand registerStudent;

/// <summary>
/// Initializes a new instance of the StudentViewModel class.
/// </summary>
public StudentViewModel()
{
_student = new Student(firstName, lastName);
firstName = _student.FirstName;
lastName = _student.LastName;
FormOne();

}

public string FirstName
{
get { return _student.FirstName; }
set
{
if (value == _student.FirstName)
return;
_student.FirstName = value;
OnPropertyChanged("FirstName");
}
}




///Please note that i tried this to
public string FirstName
{
get { return firstNam; }
set
{
firstName = value;
OnPropertyChanged("FirstName");
}
}


public string LastName
{
get { return _student.LastName; }
set
{
if (value==_student.LastName)
return;
_student.LastName = value;

OnPropertyChanged("LastName");
}
}

public DataView StudentDetails
{
get { return studentDetails; }
set
{
if (value == studentDetails)
return;
studentDetails = value;
OnPropertyChanged("StudentDetails");
}
}


public ICommand RegisterStudent
{
get
{
if (registerStudent == null)
{
registerStudent = new CommandBase(i => this.CreateStudent(), null);
}
return registerStudent;
}
}

public void FormOne()
{

string databaseName = "Kwega.db3";
SQLiteConnection connection = new SQLiteConnection("Data Source=" + databaseName + "; Version=3;");
string students = "SELECT first_name, last_name FROM students";
SQLiteDataAdapter adapter = new SQLiteDataAdapter(students, connection);
connection.Open();
adapter.SelectCommand.CommandTimeout = 120;
DataSet ds = new DataSet();
adapter.Fill(ds, "students");
StudentDetails = ds.Tables["students"].DefaultView;
connection.Close();

}


/// <summary>
/// Method to create new student and creating a new student table if
/// it doesnt exist in the database
/// </summary>
private void CreateStudent()
{
if (_student.IsValid)
{
string databaseName = "Kwega.db3";
var connection = new SQLiteConnection("Data Source=" + databaseName + "; Version=3;");
connection.Open();
var createStudentTable =
"CREATE TABLE IF NOT EXISTS students (student_id INTEGER PRIMARY KEY, first_name TEXT(255), last_name TEXT(255))";

var createCommand = new SQLiteCommand(createStudentTable, connection);
createCommand.ExecuteNonQuery();

string insert_student = "INSERT INTO students(first_name, last_name) VALUES (" +
"'" + _student.FirstName + "', '" + _student.LastName + "')";

var insert_CMD = new SQLiteCommand(insert_student, connection);
insert_CMD.ExecuteNonQuery();
connection.Close();
}
else
{
MessageBox.Show("Student details weren't saved", "Invalid student!", MessageBoxButton.OK, MessageBoxImage.Information);
}

}

string IDataErrorInfo.Error
{
get { return (_student as IDataErrorInfo).Error; }
}

string IDataErrorInfo.this[string propertyName]
{
get
{
string error = (_student as IDataErrorInfo)[propertyName];
return error;
}
}

}

}

我认为错误可能出在我的 View 模型中,但我最近 3 天无法调用它。下面是我的代码隐藏文件和 xaml 文件。

using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
using WpfApplication_tutorial.Model;
using WpfApplication_tutorial.ViewModel;

namespace WpfApplication_tutorial.UserControls
{
/// <summary>
/// Interaction logic for FormOneDataControl.xaml
/// </summary>
public partial class FormOneDataControl : UserControl
{
public StudentViewModel ViewModel;

public FormOneDataControl()
{
InitializeComponent();
StudentViewModel studentViewModel = new StudentViewModel();
this.DataContext = studentViewModel;
}
}
}

最后是我的 xaml 文件

<ListView x:Name="FormOneView" ItemsSource="{Binding }" DataContext="{Binding StudentDetails}" >
<ListView.View>
<GridView>
<GridViewColumn Header="First Name" Width="90" DisplayMemberBinding="{Binding Path=FirstName}" />
<GridViewColumn Header="Last Name" Width="90" DisplayMemberBinding="{Binding Path=LastName}" />
</GridView>
</ListView.View>
</ListView>

请注意,我尝试使用 ItemsSource="{Binding Path=MethodName}"和 DisplayMemberBinding="{Binding FirstName}"` 例如。

最佳答案

A DataView不是您的数据的好容器。您最好声明一个带有属性的自定义类以显示在您的 ListView 中。这样您就可以使用那些命名属性进行数据绑定(bind)。

目前,您的 XAML 混淆了...您的 ListView正在寻找 StudentDetails项目的属性,即 DataView , 然后你的 GridViewColumn.DisplayMemberBinding s 指向您的 StudentViewModel 中的属性与 DataView 中的项目无关.

相反,使用这些名称属性创建自定义类,然后在您的 StudentViewModel 中创建该类型的集合类和数据绑定(bind)到该集合属性。那么你的GridViewColumn.DisplayMemberBinding应该可以。

关于c# - ListView 仅显示空行。 WPF MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27506857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com