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

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

為什么我的 Subscribe 方法在使用 Prism EventAggregator

為什么我的 Subscribe 方法在使用 Prism EventAggregator

C#
白板的微信 2023-04-29 09:58:14
我正在學習棱鏡。幾個小時后我就遇到了一個問題,當訂閱事件時,訂閱方法沒有被調用。我正在使用Prism和Autofac。在下面的簡化示例中,在MainViewModel Publish("dupa");事件中調用了ctor. 然后在按鈕上單擊UpdateWindow打開。在窗口的后端創建了UpdateViewModel的實例。內部更新 VM ctor已運行,但在未執行 UpdateName 之后Subscribe(UpdateName);,由于某種我不明白的原因。完整代碼:public class MainViewModel : ViewModelBase    {        private IEventAggregator _eventAggregator;        public MainViewModel(IEventAggregator eventAggregator)        {            _eventAggregator = eventAggregator; //Prism            _eventAggregator.GetEvent<UpdateNameEvent>().Publish("dupa");            OnOpenCommand = new DelegateCommand(OnOpenWin);        }        public void OnOpenWin(object obj)        {            UpdateWindow win = new UpdateWindow();            win.Show();        }        public ICommand OnOpenCommand { get; private set; }    }public class UpdateViewModel : ViewModelBase    {        private IEventAggregator _eventAggregator;        public UpdateViewModel(IEventAggregator eventAggregator)        {            _eventAggregator = eventAggregator; //Prism            _eventAggregator.GetEvent<UpdateNameEvent>().Subscribe(UpdateName);        }        private void UpdateName(string name)        {            this.Name = name; //is not called at all        }        private string _name;        public string Name        {            get            {                return _name;            }            set            {                _name = value;                OnPropertyChanged();            }        }    }public partial class UpdateWindow : Window    {        public UpdateWindow()        {            var bootStrapper = new BootStrapper();            var container = bootStrapper.BootStrap();            UpdateViewModel vm = container.Resolve<UpdateViewModel>();            InitializeComponent();            DataContext = vm;        }    }
查看完整描述

1 回答

?
一只萌萌小番薯

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

我不明白為什么這種依賴不起作用?


因為您EventAggregator為 .創建了一個新的UpdateViewModel。


var bootStrapper = new BootStrapper();

var container = bootStrapper.BootStrap();

UpdateViewModel vm = container.Resolve<UpdateViewModel>();

這看起來好像為 新建了一個容器UpdateWindow,而新容器將有一個新的——也就是不同的—— EventAggregator。當然,這兩者不會相互發送事件。


所以解決方案是使用一個單一的容器來解決你所有的東西。這就是您使用 static 時發生的情況Utility。您應該避免使用這樣的服務定位器??匆幌耉iewModelLocator,這使得為給定視圖創建視圖模型變得非常容易,例如,或者在創建容器時將容器傳遞給它UpdateWindow(雖然也有些丑陋)。


查看完整回答
反對 回復 2023-04-29
  • 1 回答
  • 0 關注
  • 144 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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