gpt4 book ai didi

c# - 动态创建的 MetroWindow 中的 MetroWindow.RightWindowCommands

转载 作者:太空宇宙 更新时间:2023-11-03 23:44:20 27 4
gpt4 key购买 nike

如何通过 Caliburn.Micro IWindowManager Show 方法在动态创建的 MetroWindow 中绑定(bind)/创建 MetroWindow.RightWindowCommands?

例如,我创建了一个自定义 IWindowManager 实现以始终创建 MetroWindow 而不是默认 Window。因此,每当从 Caliburn 创建一个新窗口时,它将是 MetroWindow 实例。

我有一个通过 IWindowManager 动态创建窗口的逻辑:

聊天管理器

public class ChatManager : IChatManager
{
private readonly IChatWindowSettings chatWindowSettings;
private readonly IWindowManager windowManager;
private readonly IChatFactory chatFactory;
private IDictionary<WeakReference, WeakReference> chats;

public ChatManager(IChatWindowSettings chatWindowSettings, IWindowManager windowManager, IChatFactory chatFactory)
{
this.chatWindowSettings = chatWindowSettings;
this.windowManager = windowManager;
this.chatFactory = chatFactory;

chats = new Dictionary<WeakReference, WeakReference>();
}

public void OpenFor(ISender sender)
{
var settings = chatWindowSettings.Create();
var viewModel = CreateOrGetViewModel(sender);
windowManager.ShowWindow(viewModel, null, settings);
}
private IChat CreateOrGetViewModel(ISender sender){//code...}

那些窗口是聊天窗口。这很好用。但是,我想直接在 MetroWindow RightCommands 中绑定(bind)/创建一个按钮。此按钮将绑定(bind)到 IChat 实现(这是一个 View 模型):

public class ChatViewModel : Screen, IChat
{
public void DoSomething(){}
}

我怎样才能完成这样的事情?

最佳答案

这里有一些关于你的问题的想法

调用示例

var view = new MainWindow(new ChatViewModel() { ChatName = "Chat name" });
view.Show();

模型样本

public class ChatViewModel
{
public string ChatName { get; set; }

private ICommand chatCommand;
public ICommand ChatCommand
{
get
{
return chatCommand
?? (chatCommand = new SimpleCommand() {
CanExecutePredicate = o => true,
ExecuteAction = o => MessageBox.Show("Hurray :-D")
});
}
}
}

窗口代码隐藏

public partial class MainWindow : MetroWindow
{
public MainWindow(ChatViewModel chatViewModel)
{
this.DataContext = chatViewModel;
InitializeComponent();
}
}

窗口 xaml

<Controls:MetroWindow x:Class="MahAppsMetroSample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="http://metro.mahapps.com/winfx/xaml/controls"
Title="MainWindow"
GlowBrush="{DynamicResource AccentColorBrush}"
Height="350"
Width="525">

<Controls:MetroWindow.RightWindowCommands>
<Controls:WindowCommands>
<Button Content="{Binding ChatName}"
Command="{Binding ChatCommand}" />
</Controls:WindowCommands>
</Controls:MetroWindow.RightWindowCommands>

<Grid>

<!-- the content -->

</Grid>
</Controls:MetroWindow>

简单的命令

public class SimpleCommand : ICommand
{
public Predicate<object> CanExecutePredicate { get; set; }
public Action<object> ExecuteAction { get; set; }

public bool CanExecute(object parameter)
{
if (CanExecutePredicate != null)
return CanExecutePredicate(parameter);
return true; // if there is no can execute default to true
}

public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}

public void Execute(object parameter)
{
if (ExecuteAction != null)
ExecuteAction(parameter);
}
}

希望对你有帮助

关于c# - 动态创建的 MetroWindow 中的 MetroWindow.RightWindowCommands,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27972816/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com