第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么 C# WPF 按鈕綁定命令在使用簡單注入器后不會(huì)更改視圖?

為什么 C# WPF 按鈕綁定命令在使用簡單注入器后不會(huì)更改視圖?

C#
烙印99 2022-11-13 13:55:15
我正在使用以下文章作為入門代碼: 在 WPF MVVM簡單注入器 WPF 集成中的視圖之間導(dǎo)航目標(biāo):嘗試使用按鈕綁定命令和簡單注入器以 WPF 形式從視圖 1 轉(zhuǎn)到視圖 2,以將依賴項(xiàng)注入視圖。注意:這些依賴項(xiàng)是保存來自外部來源的數(shù)據(jù)的存儲(chǔ)庫。問題:使用 Simple Injector 將依賴項(xiàng)注入到我的 MainWindow 和 MainWindowViewModel 后,我的按鈕不再更改我的當(dāng)前視圖(到我的另一個(gè)視圖)。當(dāng)使用 Visual Studio 并使用斷點(diǎn)進(jìn)行調(diào)試時(shí),代碼似乎永遠(yuǎn)停留在CanExecuteRelayCommand.cs 函數(shù)中的循環(huán)中(請(qǐng)參閱在 WPF MVVM 中的視圖之間導(dǎo)航),其中某些東西一遍又一遍地調(diào)用它。我無法對(duì)CanExecute函數(shù)進(jìn)行更多調(diào)試,因?yàn)橛泻芏啻a被傳遞(來自 DLL 等)。當(dāng)不使用斷點(diǎn)時(shí),它就好像我的按鈕什么也沒做一樣。我在輸出窗口中沒有看到按鈕錯(cuò)誤,也沒有拋出異常。命令綁定有效,因?yàn)槲铱梢钥吹絆nGo2Screen在調(diào)試時(shí)調(diào)用了 MainWindowViewModel.cs 中的函數(shù)。調(diào)用后OnGo2Screen,它按預(yù)期移動(dòng)代碼,直到卡在CanExecute.我試過的我檢查了我的 MainWindow 的數(shù)據(jù)上下文,我可以看到它具有所有正確的功能。我為“在 WPF MVVM 中的視圖之間導(dǎo)航”一文創(chuàng)建了一個(gè)單獨(dú)的項(xiàng)目,我能夠很好地更改視圖。但是每當(dāng)我嘗試使用 Simple Injector 時(shí),我的按鈕就會(huì)壞掉。我注意到,當(dāng)不使用 Simple Injector 時(shí),代碼從CanExecute函數(shù)移動(dòng)到CanExecuteChangedEventHandler 并執(zhí)行刪除和添加修改器,然后按預(yù)期更改視圖。但是,當(dāng)使用 Simple Injector 時(shí),它不會(huì)這樣做。我使用我的 App.xaml.cs 作為啟動(dòng)程序的代碼,其中我的 App.xaml 具有“頁面”的構(gòu)建操作。SimulationCaseView 是視圖 1(默認(rèn)起始視圖)。StreamsView 是視圖 2(只是另一個(gè)視圖)。UserControl3 是視圖 3(只是另一個(gè)視圖)。下面是我的代碼。請(qǐng)參閱為任何剩余代碼提供的兩個(gè)鏈接,因?yàn)槲业暮芏喙δ芏蓟诖恕?
查看完整描述

2 回答

?
一只斗牛犬

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超2個(gè)贊

如何解決?

在更新命令狀態(tài)后調(diào)用此方法:

CommandManager.InvalidateRequerySuggested();

為什么不更新?

命令僅在這些一般事件發(fā)生時(shí)更新:

  • KeyUp

  • MouseUp

  • GotKeyboardFocus

  • LostKeyboardFocus

有關(guān)詳細(xì)信息,請(qǐng)參閱此源代碼:CommandDevice.cs

對(duì)于其他控件,它有更多的事件需要刷新:

  • 長按時(shí)重復(fù)增加RepeatButton

  • DataGrid...

  • SinglePageViewer...

您可以雙擊此鏈接CommandManager.InvalidateRequerySuggested()的方法查看其他刷新命令狀態(tài)的事件。

因此,如果您的更新不在這些事件中發(fā)生,您的命令狀態(tài)將不會(huì)更新。

其他信息

您說在使用 Visual Studio 并使用斷點(diǎn)進(jìn)行調(diào)試時(shí),代碼似乎在CanExecuteRelayCommand.cs 的函數(shù)中永遠(yuǎn)卡在一個(gè)循環(huán)中。

這不是 for 的循環(huán)CanExecute,而是活動(dòng)窗口在應(yīng)用程序和 Visual Studio 之間切換時(shí)的GotKeyboardFocusand事件。LostKeyboardFocus


查看完整回答
反對(duì) 回復(fù) 2022-11-13
?
叮當(dāng)貓咪

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊

簡答

問題在于Lifestyle您的 ViewModel 必須設(shè)置為 aSingleton而不是 default Transient。


    private static Container Bootstrap()

    {

        // Create the container as usual.

        var container = new Container();


        // Register your types, for instance:



        // Register your windows and view models:

        //container.Register<MainWindow>(Lifestyle.Singleton); //not needed

        container.Register<MainWindowViewModel>(Lifestyle.Singleton);


        container.Verify();


        return container;

    }

然后你可以通過簡單的方式啟動(dòng)應(yīng)用程序


    private static void RunApplication(Container container)

    {

        try

        {

            var mainWindow = container.GetInstance<MainWindow>();

            var app = new App();

            app.InitializeComponent();

            app.Run(mainWindow);

        }

        catch (Exception ex)

        {

            //Log the exception and exit

            Debug.WriteLine(ex.Message);

        }

    }

完整代碼在github 上。


長答案 - TL; DR

當(dāng)您調(diào)用container.Verifyin 時(shí),Bootstrap您將創(chuàng)建一個(gè)實(shí)例MainWindowViewModel來驗(yàn)證其實(shí)例化,并創(chuàng)建另一個(gè)實(shí)例來驗(yàn)證MainWindow類。


順便說一句,您可以通過不驗(yàn)證容器來解決您的問題!


所以第二個(gè)解決方案是


        //container.Register<MainWindow>(); // => Lifestyle.Transient;

        container.Register<MainWindowViewModel>(); // => Lifestyle.Transient;


        //container.Verify();

現(xiàn)在,請(qǐng)注意您在c.tor中有Mediator訂閱。MainWindowViewModel


    public static void Subscribe(string token, Action<object> callback)

    {

        if (!pl_dict.ContainsKey(token))

        {

            var list = new List<Action<object>>();

            list.Add(callback);

            pl_dict.Add(token, list);

        }

        else

        {

            bool found = false;

            //foreach (var item in pl_dict[token])

            //    if (item.Method.ToString() == callback.Method.ToString())

            //        found = true;

            if (!found)

                pl_dict[token].Add(callback);

        }

    }

foreach循環(huán)——我只在上面評(píng)論過(它是解決你的問題的第三個(gè)替代選項(xiàng)) ——會(huì)讓你跳過對(duì)第二個(gè)正確的 ViewModel 方法的調(diào)用,并會(huì)讓你留下第一個(gè)錯(cuò)誤的方法(記住Bootstrap驗(yàn)證創(chuàng)建了它兩次)。如果你想要第四種替代解決方案,使用中介者模式IComponent的經(jīng)典界面


public interface IComponent

{

     void OnGo1Screen(object obj);

     void OnGo2Screen(object obj);

}

public class MainWindowViewModel : BaseViewModel, IComponent

您還可以將訂閱移出 c.tor


  public MainWindowViewModel()

  {

     // Add available pages and set page

     PageViewModels.Add(new UserControl1ViewModel());

     PageViewModels.Add(new UserControl2ViewModel());


     CurrentPageViewModel = PageViewModels[0];


     //Mediator.Subscribe("GoTo1Screen", OnGo1Screen);

     //Mediator.Subscribe("GoTo2Screen", OnGo2Screen);

  }

進(jìn)入你的Program:


            var context = mainWindow.DataContext as IComponent;

            Mediator.Subscribe("GoTo1Screen", context.OnGo1Screen);

            Mediator.Subscribe("GoTo2Screen", context.OnGo2Screen);


查看完整回答
反對(duì) 回復(fù) 2022-11-13
  • 2 回答
  • 0 關(guān)注
  • 150 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)