我有一个绑定到ListView的应用程序列表。
private List<_Application> _applicationList;
public List<_Application> applicationList
{
get { return _applicationList; }
set
{
_applicationList = value;
OnPropertyChanged();
}
}
ListView ItemTemplate设置为按钮。
<ListView
ItemsSource="{Binding applicationList}"
BorderThickness="5"
Style="{DynamicResource ListViewStyle}">
<ListView.ItemTemplate>
<DataTemplate>
<Button
Command="{Binding RunCommand}"
Style="{StaticResource ApplicationButtonStyle}"
Content="{Binding name}"
Background="{Binding colorRGB}" >
</Button>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
当我点击按钮时,我想要运行一个应用程序。我的模型_Application具有运行进程的ActionCommand。
public class _Application
{
public ActionCommand RunCommand
{
get
{ return new ActionCommand(action => Run()); }
}
private void Run()
{
Process p = new Process();
p.StartInfo.FileName = path;
try
{
p.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public _Application()
{
}
}
我不确定在模型中保留ActionCommand是否正确?如何在MVVM模式中正确实现它? ActionCommand应放在何处以及如何将其绑定到ListView of Buttons以便运行正确的_Application?
答案 0 :(得分:1)
我认为最好的方法是将模型(_Application
)作为参数传递给命令。
RunCommand = new RelayCommand(param => this.OnRun(param));
指挥行动
private void OnRun(_Application app)
{
//Any action with your model
}
Xaml
Command="{Binding DataContext.RunCommand, ElementName=PageRootKey}"
CommandParameter="{Binding Mode=OneWay}">
答案 1 :(得分:0)
首先,你应该使用ICommand而不是ActionCommand,原因很简单,如果将来你想要用更好的方法替换ActionCommand来实现ICommand,你就不需要在代码中替换那么多地方。 / p>
public ICommand RunCommand
{
get
{ return new ActionCommand(Run); }
}
正确的_Application将在列表视图中的每个项目连接到集合中的单个_Application项目时运行。
注意:在上面的代码中我写了... ActionCommand(Run);因为ActionCommand接受一个Action参数,所以你可以很快编写代码并且更加可读。
我当然假设在完整的代码中_Application具有name和colorRgb的属性。 事实上,如果您希望使用正确的MVVM模式,那么colorRgb不应该在viewmodel或模型中。这是一个观点。您应该使用转换器(读取IValueConverter)为每个按钮设置不同的颜色(尽管它不是UX友好的)。
最后一点,像name这样的属性应该是Name(大写N),因为C#中的属性名应该始终以大写字母开头。