如何从Icommand命令添加新的ObservableCollection?

时间:2013-10-18 18:56:29

标签: c# .net wpf mvvm observablecollection

我正在学习一个简单的MVVM项目。我试图通过ICommand命令添加到ObservableCollection,但我无法做到?

MainWindow.cs我没有添加任何内容*

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Local="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.DataContext>
        <Local:ViewModel></Local:ViewModel>
    </Grid.DataContext>

    <ListView Grid.Row="0" x:Name="lstNames" Margin="5,5,5,5" Grid.Column="1" ItemsSource="{Binding View_}">
        <ListView.View>
            <GridView x:Name="Setting_Items">
                <GridViewColumn Header="Setting_A"  DisplayMemberBinding="{Binding View_String}"/>
            </GridView>
        </ListView.View>
    </ListView>

   <TextBox Height="23" 
            HorizontalAlignment="Left" 
            Margin="145,195,0,0" 
            Name="textBox1" 
            VerticalAlignment="Top" 
            Width="120" />
  <ComboBox Height="23" 
            HorizontalAlignment="Left" 
            Margin="269,195,0,0" 
            Name="My_ComboBox" 
            VerticalAlignment="Top" 
            Width="222"     
            ItemsSource="{Binding View_}"/>
    <Button Content="Message Text" 
            Height="23" 
            HorizontalAlignment="Left"
            Margin="52,166,0,0" 
            Name="button1" 
            VerticalAlignment="Top" 
            Width="75" 
            CommandParameter="{Binding Text, ElementName=textBox1}"
            Command="{Binding Print_Line}"/>
    <Button Content="Add To Drop"
            Height="23" 
            HorizontalAlignment="Left"
            Margin="52,195,0,0" 
            Name="button2" 
            VerticalAlignment="Top" 
            Width="75" 
            />


</Grid>


    public class View
{
    public string View_String {get; set;}
}

    public class SimpleDelegateCommand : ICommand
{
    Action<object> _executeDelegate;

    public SimpleDelegateCommand(Action<object> executeDelegate)
    {
        _executeDelegate = executeDelegate;
    }

    public void Execute(object parameter)
    {
        _executeDelegate(parameter);
    }

    public bool CanExecute(object parameter) { return true; }
    public event EventHandler CanExecuteChanged;
}

 public class ViewModel
{
    private ObservableCollection<View> _View;

    public string _View_String { get; set; }

    public ObservableCollection<View> View_
    {
        get { return _View; }
        set { _View = value; }
    }

    ICommand _Print_Line = new SimpleDelegateCommand((x) => MessageBox.Show(x.ToString()));

    ICommand _Add_Line = new SimpleDelegateCommand((x) =>
         View_ = new ObservableCollection<View>() /////////Error HERE
        {
            new View(){View_String = x.ToString()}
        }
        );


    public ViewModel()
    {
        View_ = new ObservableCollection<View>()
        {
            new View(){View_String = "Setting 1"},
            new View(){View_String = "Setting 2"}
        };
    }

    public ICommand Print_Line { get { return _Print_Line; } }
    public ICommand Add_Line { get { return _Add_Line; } }
}

如何使用ICommand命令添加到我的ObservableCollection?或者我该怎么做呢?

此外,如何使用ICommand命令执行多个任务,例如:         ICommand _Print_Line = new SimpleDelegateCommand((x)=&gt; MessageBox.Show(x.ToString()); MessageBox.Show(“Second task”));

3 个答案:

答案 0 :(得分:1)

执行多项任务:

_Print_Line = new SimpleDelegateCommand((x) => {
   MessageBox.Show(x.ToString());  
   MessageBox.Show("Second task");
 });

将私人套装添加到您的命令字段,以便从您的班级

访问它
private ICommand print_Line;
public ICommand Print_Line { 
                             get { return print_Line; } 
                             private set { print_Line = value; } 
                           }

private ICommand add_Line;
public ICommand Add_Line  { 
                             get { return add_Line; } 
                             private set { add_Line = value; } 
                          }

也许也可以这样帮助:

private ICommand print_Line;
public ICommand Print_Line { get { return print_Line; } }

private ICommand add_Line;
public ICommand Add_Line{ get { return add_Line; } }

答案 1 :(得分:0)

Commands初始化代码移到constructor课程的ViewModel内。您正在尝试访问尚未构建的View_,从而给出错误。构造函数外部的对象初始值设定项不应该调用实例方法/属性,因为在此之前不构造类。

ICommand _Print_Line;

ICommand _Add_Line;


public ViewModel()
{
    _Print_Line = new SimpleDelegateCommand((x) => MessageBox.Show(x.ToString()));

    _Add_Line = new SimpleDelegateCommand((x) =>
     View_ = new ObservableCollection<View>() /////////Error HERE
    {
        new View(){View_String = x.ToString()}
    }
    );

    View_ = new ObservableCollection<View>()
    {
        new View(){View_String = "Setting 1"},
        new View(){View_String = "Setting 2"}
    };
}

答案 2 :(得分:0)

首先,您的代码几乎无法读取。错误很简单。初始化字段时,无法引用非静态字段。 ICommand _Add_Line是一个实例字段。就像_View一样。如果要引用它,请在类的构造函数中初始化ICommand _Add_Line。每次调用非静态字段或方法时,都需要该类的实例来获取其值。 stackoverflow

在这个问题上有几个答案