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í),代碼似乎在CanExecute
RelayCommand.cs 的函數(shù)中永遠(yuǎn)卡在一個(gè)循環(huán)中。
這不是 for 的循環(huán)CanExecute
,而是活動(dòng)窗口在應(yīng)用程序和 Visual Studio 之間切換時(shí)的GotKeyboardFocus
and事件。LostKeyboardFocus

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);
- 2 回答
- 0 關(guān)注
- 150 瀏覽
添加回答
舉報(bào)