C# WPF MVVM清除绑定到Listview SelectedItem的文本框

C# WPF MVVM清除绑定到Listview SelectedItem的文本框,c#,wpf,listview,mvvm,C#,Wpf,Listview,Mvvm,我正试图学习C#mvvm和wpf,所以我决定做一个简单的项目(一个图书馆的图书和读者管理应用程序),现在我有点迷路了,所以我真的很想得到一些帮助。 在我的视图中,我有一个显示读卡器的列表视图,还有一堆绑定到列表视图的选定项(名称、地址等)的文本框。 listview绑定到使用Linq2SQL从数据库表(读卡器)创建的可观察的读卡器集合 在文本框下面有几个按钮(清除/添加/保存/删除) 我遇到的问题是,如果我在单击按钮时尝试执行某些命令,listview的“选定项”似乎为空 当我点击清除按钮时,

我正试图学习C#mvvm和wpf,所以我决定做一个简单的项目(一个图书馆的图书和读者管理应用程序),现在我有点迷路了,所以我真的很想得到一些帮助。 在我的视图中,我有一个显示读卡器的列表视图,还有一堆绑定到列表视图的选定项(名称、地址等)的文本框。 listview绑定到使用Linq2SQL从数据库表(读卡器)创建的可观察的读卡器集合

在文本框下面有几个按钮(清除/添加/保存/删除)

我遇到的问题是,如果我在单击按钮时尝试执行某些命令,listview的“选定项”似乎为空

  • 当我点击清除按钮时,如果我在所选项目(读卡器)上有一个断点,它将显示为空/空,但文本框不清除; 如果在Clear方法中使用SelectedReader属性,并为其属性分配空格,则listview中的选定项也会清除(因为它绑定到读卡器的FullName属性)

  • 我在添加新读卡器和保存更改方面还有其他问题,我认为这是因为错误的linq查询,但我希望可以修复当前的问题,然后继续

我该怎么办

视图模型

  public class MainWindowViewModel : ViewModelBase
{
    private Reader selectedReader;       

    private ObservableCollection<Reader> readerList;

    public MainWindowViewModel()
    {
        SelectedReader = new Reader()
                        {
                            FullName = "",
                            SerialNumber = "",
                            IdNumber = "",
                            Adress = "",
                            AltContactMethods = ""
                        };

        BookDBDataContext rdb = new BookDBDataContext();
        ReadersList = new ObservableCollection<Reader>(rdb.Readers);

        AddR = new TblQryCommand(AddToDb);
        EditR = new TblQryCommand(EditToDb);
        DeleteR = new TblQryCommand(DeleteFromDb);
        ClearR = new TblQryCommand(ClearReaderFields);
    }

    public TblQryCommand AddR { get; private set; }
    public TblQryCommand EditR { get; private set; }
    public TblQryCommand DeleteR { get; private set; }
    public TblQryCommand ClearR { get; private set; }

    //Reader List
    public ObservableCollection<Reader> ReadersList
    {
        get { return readerList; }
        set
        {
            if (readerList != value)
            {
                readerList = value;
                RaisePropertyChanged();
            }
        }
    }

    public Reader SelectedReader
    {
        get { return selectedReader; }
        set
        {
            if (selectedReader != value)
            {
                selectedReader = value;
                RaisePropertyChanged();
            }
        }
    }

    public void AddToDb()
    {
        BookDBDataContext db = new BookDBDataContext();
        Reader r = new Reader
        {
            FullName = SelectedReader.FullName,
            SerialNumber = SelectedReader.SerialNumber,
            IdNumber = SelectedReader.IdNumber,
            Adress = SelectedReader.Adress,
            AltContactMethods = SelectedReader.AltContactMethods
        };

        db.Readers.InsertOnSubmit(r);
        db.Readers.Context.SubmitChanges();
    }

    public void DeleteFromDb()
    {

    }

    public void EditToDb()
    {

    }

    public void ClearReaderFields()
    {
        SelectedReader = new Reader
        {
            Id = 0,
            FullName = string.Empty,
            SerialNumber = string.Empty,
            IdNumber = string.Empty,
            Adress = string.Empty,
            AltContactMethods = string.Empty
        };
    }
公共类MainWindowViewModel:ViewModelBase { 私人阅读器选择阅读器; 私有可观察收集阅读器列表; 公共主窗口视图模型() { SelectedReader=新读卡器() { 全名=”, SerialNumber=“”, IdNumber=“”, 地址:”, AltContactMethods=“” }; BookDBDataContext rdb=新的BookDBDataContext(); ReadersList=新的可观察集合(rdb.Readers); AddR=新的TblQryCommand(AddToDb); EditR=新的TblQryCommand(EDITODB); DeleteR=新的TblQryCommand(DeleteFromDb); ClearR=新的TblQryCommand(ClearReaderFields); } public TblQryCommand AddR{get;private set;} 公共TblQryCommand EditR{get;专用集;} public TblQryCommand DeleteR{get;private set;} public TblQryCommand clear{get;private set;} //读者名单 公共可观察收集阅读器列表 { 获取{return readerList;} 设置 { if(readerList!=值) { readerList=值; RaisePropertyChanged(); } } } 公共阅读器选择阅读器 { 获取{return selectedReader;} 设置 { 如果(selectedReader!=值) { selectedReader=值; RaisePropertyChanged(); } } } public void AddToDb() { BookDBDataContext db=new BookDBDataContext(); 读卡器r=新读卡器 { FullName=SelectedReader.FullName, SerialNumber=SelectedReader.SerialNumber, IdNumber=SelectedReader.IdNumber, 地址=选定的读卡器地址, AltContactMethods=SelectedReader.AltContactMethods }; db.Readers.InsertOnSubmit(r); db.Readers.Context.SubmitChanges(); } public void DeleteFromDb() { } 公共无效EDITODB() { } 公共无效ClearReaderFields() { SelectedReader=新读卡器 { Id=0, FullName=string.Empty, SerialNumber=string.Empty, IdNumber=string.Empty, Adress=string.Empty, AltContactMethods=string.Empty }; } 视图:


您是否尝试将文本框的文本属性的
绑定直接设置为ViewModel的
SelectedReader
-属性? 因此,与其写这封信:

<TextBox x:Name="txtBxFullName" Text="{Binding ElementName=listviewReaders, Path=SelectedItem.FullName, Mode=TwoWay, UpdateSourceTrigger=Explicit}" ... />

你会写:

<TextBox x:Name="txtBxFullName" Text="{Binding Path=SelectedReader.FullName, Mode=TwoWay, UpdateSourceTrigger=Explicit}" ... />

<TextBox x:Name="txtBxFullName" Text="{Binding Path=SelectedReader.FullName, Mode=TwoWay, UpdateSourceTrigger=Explicit}" ... />