将命令绑定到ListView项MVVM的正确方法

时间:2017-01-26 08:57:35

标签: c# wpf mvvm binding icommand

我有一个绑定到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?

2 个答案:

答案 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#中的属性名应该始终以大写字母开头。