gpt4 book ai didi

c# - 多个按钮的一个 View 模型

转载 作者:太空宇宙 更新时间:2023-11-03 19:50:07 25 4
gpt4 key购买 nike

我是 WPF 和 MVVM 的新手。我正在尝试弄清楚如何拥有一个干净的项目结构,其中有多个按钮可以启动不同的应用程序(如 chrome、IE、记事本)。是否可以为多个按钮使用一个 ViewModel?

我已经开始使用来自 here 的代码,我的解决方案尝试是使代码从该链接成为 View 模型基础,并为每个扩展所述基础的按钮设置其他 View 模型。

每个人都有一个独特的 Action :

    public override void ClickAction()
{
Process ieProcess = new Process();
ieProcess.StartInfo.FileName = "IExplore.exe";
ieProcess.Start();
}

但是,我不确定执行此操作的正确方法。如何使用这种方法创建 DataContext?感谢您的帮助。

最佳答案

每个 View 应该有一个 View 模型;不是您 View 中的每个项目(在本例中为按钮)。执行您所描述的操作的一种简单方法是使用 CommmandParameter 属性传入您的 exe 名称:

<Button Content="Launch IE" Command="{Binding LaunchAppCommand}" CommandParameter="IExplorer.exe"/>
<Button Content="Launch Notepad" Command="{Binding LaunchAppCommand}" CommandParameter="notepad.exe"/>
<Button Content="Launch Chrome" Command="{Binding LaunchAppCommand}" CommandParameter="chrome.exe"/>

用你的命令:

public ICommand LaunchAppComand {get; private set;}
...
public MyViewModel()
{
LaunchAppCommand = new DelegateCommand(LaunchApp);
}
...
private void LaunchApp(object parameter)
{
string processName = (string)parameter;
Process launchProc = new Process();
launchProc.StartInfo.FileName = processName;
launchProc.Start();
}

为避免对所有按钮进行硬编码,您可以使用 ItemsControl,它会为其创建的每个模板设置单独的数据上下文。为此,您需要一组数据类,以及一种稍微不同的方式来获取您的命令:

//ProcessShortcut.cs
public class ProcessShortcut
{
public string DisplayName {get; set;}
public string ProcessName {get; set;}
}

//MyViewModel.cs, include the previous code

//INotifyPropertyChanged left out for brevity
public IEnumerable<ProcessShortcut> Shortcuts {get; set;}

public MyViewModel()
{
Shortcuts = new List<ProcessShortcut>()
{
new ProcessShortcut(){DisplayName = "IE", ProcessName="IExplorer.exe"},
new ProcessShortcut(){DisplayName = "Notepad", ProcessName="notepad.exe"},
new ProcessShortcut(){DisplayName = "Chrome", ProcessName="chrome.exe"},
};
}

//MyView.xaml
<Window x:Name="Root">
...
<ItemsControl ItemsSource="{Binding Shortcuts}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding DisplayName, StringFormat='{}Start {0}'}"
Command="{Binding ElementName=Root, Path=DataContext.LaunchAppCommand}"
CommandParameter="{Binding ProcessName}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
...
</Window>

因为 ItemsControl 将模板内的 DataContext 设置为绑定(bind)项,所以您需要 ElementName 绑定(bind)才能获取命令,并且不要需要限定对 ProcessShortcut 成员的访问权限。从长远来看,当您有像这样的重复控制时,这就是您通常想要采用的方法。

关于c# - 多个按钮的一个 View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40470733/

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