亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 MVVM 模式關閉打開的窗口,產生 System.NullReferenceException

使用 MVVM 模式關閉打開的窗口,產生 System.NullReferenceException

C#
動漫人物 2023-05-13 16:03:49
我正在嘗試使用 WPF C# 學習 MVVM 模式。在將信息保存到 sqlite 數據庫后嘗試關閉打開的窗口時,我遇到了錯誤。當發出保存新聯系人的命令時,我在 HasAddedContact(this, new EventArgs()); 上收到錯誤消息錯誤:System.NullReferenceException:“對象引用未設置為對象的實例。”我的視圖模型:public class NewContactViewModel : BaseViewModel    {        private ContactViewModel _contact;        public ContactViewModel Contact        {            get { return _contact; }            set { SetValue(ref _contact, value); }        }        public SaveNewContactCommand SaveNewContactCommand { get; set; }        public event EventHandler HasAddedContact;        public NewContactViewModel()        {            SaveNewContactCommand = new SaveNewContactCommand(this);            _contact = new ContactViewModel();        }        public void SaveNewContact()        {            var newContact = new Contact()            {                Name = Contact.Name,                Email = Contact.Email,                Phone = Contact.Phone            };            DatabaseConnection.Insert(newContact);            HasAddedContact(this, new EventArgs());        }    }保存新聯系人命令:    public class SaveNewContactCommand : ICommand    {        public NewContactViewModel VM { get; set; }        public SaveNewContactCommand(NewContactViewModel vm)        {            VM = vm;        }        public event EventHandler CanExecuteChanged;        public bool CanExecute(object parameter)        {            return true;        }        public void Execute(object parameter)        {            VM.SaveNewContact();        }    }NewContactWindow.Xaml.Cs 背后的代碼:public partial class NewContactWindow : Window    {        NewContactViewModel _viewModel;        public NewContactWindow()        {            InitializeComponent();            _viewModel = new NewContactViewModel();            DataContext = _viewModel;            _viewModel.HasAddedContact += Vm_ContactAdded;        }        private void Vm_ContactAdded(object sender, EventArgs e)        {            this.Close();        }    }
查看完整描述

1 回答

?
人到中年有點甜

TA貢獻1895條經驗 獲得超7個贊

您正在構造函數中創建 NewContactWindow 的視圖模型,正確地將其分配給 DataContext,并正確地向該事件添加處理程序。不幸的是,您還在資源中創建了相同視圖模型的第二個實例,并且您手動設置所有綁定的 Source 屬性以使用資源中沒有事件處理程序的那個。


Window.DataContext您在構造函數中設置的 是 Window XAML 中任何綁定的默認源。讓它做它的事情。Mode=TwoWay我還刪除了Bindings to 中的所有冗余內容TextBox.Text,因為該屬性已定義為默認情況下所有綁定都是 TwoWay。我認為也沒有UpdateSourceTrigger=PropertyChanged做任何必要或有幫助的事情:這會導致 Binding 在每次按下鍵時更新您的 viewmodel 屬性,而不是僅在 TextBox 失去焦點時更新。但是我認為您沒有對重要的屬性做任何事情;沒有驗證或任何東西。但是 TextBox.Text是為數不多的實際使用它的地方之一,所以我把它留在了里面。


您應該在其他窗口中刪除類似的視圖模型資源。它沒有任何傷害,但充其量也沒有用。在最壞的情況下,這是一個有吸引力的麻煩。用火把它燒死,把骨灰埋在半夜寂寞的十字路口下。


<Window x:Class="Contacts_App.View.NewContactWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:local="clr-namespace:Contacts_App.View"

        xmlns:vm="clr-namespace:Contacts_App.ViewModel"

        mc:Ignorable="d"

        Title="New Contact Window" Height="250" Width="350">


    <Grid>

        <StackPanel 

            Margin="10">

            <Label Content="Name" />

            <TextBox 

                Text="{Binding Contact.Name, UpdateSourceTrigger=PropertyChanged}"

                Margin="0,0,0,5"/>

            <Label Content="Email" />

            <TextBox 

                Text="{Binding Contact.Email, UpdateSourceTrigger=PropertyChanged}"

                Margin="0,0,0,5"/>

            <Label Content="Phone Number" />

            <TextBox 

                Text="{Binding Contact.Phone, UpdateSourceTrigger=PropertyChanged}"

                Margin="0,0,0,5"/>

            <Button 

                Content="Save"

                Command="{Binding SaveNewContactCommand}"/>

        </StackPanel>

    </Grid>

</Window>


查看完整回答
反對 回復 2023-05-13
  • 1 回答
  • 0 關注
  • 236 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號