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

C# 如何从Icommand命令添加新的ObservableCollection?,c#,.net,wpf,mvvm,observablecollection,C#,.net,Wpf,Mvvm,Observablecollection,我正在学习一个简单的MVVM项目。我试图通过ICommand命令添加到ObservaleCollection,但我无法 MainWindow.cs我没有添加任何内容* <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/

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

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>

公共类SimpleDelegateCommand:ICommand
{
行动(已执行的电子门);;
公共SimpleDelegateCommand(操作已执行Elegate)
{
_ExecuteElegate=ExecuteElegate;
}
public void Execute(对象参数)
{
_ExecuteElegate(参数);
}
public bool CanExecute(对象参数){return true;}
公共事件处理程序CanExecuteChanged;
}

公共类视图模型
{
私有可观察收集视图;
公共字符串_视图_字符串{get;set;}
公共可观测集合视图_
{
获取{return\u View;}
设置{u View=value;}
}
ICommand\u Print\u Line=newsimpledelegateCommand((x)=>MessageBox.Show(x.ToString());
ICommand\u Add\u Line=新的SimpleDelegateCommand((x)=>
视图=新的ObservableCollection()//此处有错误
{
新视图(){View_String=x.ToString()}
}
);
公共视图模型()
{
视图=新的ObservableCollection()
{
新建视图(){View_String=“Setting 1”},
新建视图(){View_String=“Setting 2”}
};
}
公共ICommand Print_Line{get{return}Print_Line;}
公共ICommand Add_Line{get{return}
}
如何使用ICommand命令添加到ObservableCollection?或者我该怎么做

另外,如何使用ICommand命令执行多个任务,例如:
ICommand\u Print\u Line=newsimpledelegateCommand((x)=>MessageBox.Show(x.ToString());MessageBox.Show(“第二个任务”)

执行多个任务:

_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; } }

执行多个任务:

_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; } }

ViewModel
类的
构造函数中移动
命令
初始化代码。您试图访问尚未构造的视图,因此出现错误。构造函数外部的对象初始值设定项不应调用实例方法/属性,因为类在此之前尚未构造

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"}
    };
}
ICommand\u打印行;
i命令_添加_行;
公共视图模型()
{
_Print_Line=newsimpledelegateCommand((x)=>MessageBox.Show(x.ToString());
_Add_Line=新的SimpleDelegateCommand((x)=>
视图=新的ObservableCollection()//此处有错误
{
新视图(){View_String=x.ToString()}
}
);
视图=新的ObservableCollection()
{
新建视图(){View_String=“Setting 1”},
新建视图(){View_String=“Setting 2”}
};
}

视图模型
类的
构造函数中移动
命令
初始化代码。您试图访问尚未构造的视图,因此出现错误。构造函数外部的对象初始值设定项不应调用实例方法/属性,因为类在此之前尚未构造

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"}
    };
}
ICommand\u打印行;
i命令_添加_行;
公共视图模型()
{
_Print_Line=newsimpledelegateCommand((x)=>MessageBox.Show(x.ToString());
_Add_Line=新的SimpleDelegateCommand((x)=>
视图=新的ObservableCollection()//此处有错误
{
新视图(){View_String=x.ToString()}
}
);
视图=新的ObservableCollection()
{
新建视图(){View_String=“Setting 1”},
新建视图(){View_String=“Setting 2”}
};
}

首先,您的代码几乎不可读。这个错误很直接。初始化字段时,不能引用非静态字段。 ICommand\u Add\u行是一个实例字段。就像你的观点一样。如果要引用它,请在类的构造函数中初始化ICommand _Add_行。每次调用非静态字段或方法时,都需要该类的实例来获取其值。
在这个问题上有几个答案首先,您的代码几乎不可读。这个错误很直接。初始化字段时,不能引用非静态字段。 ICommand\u Add\u行是一个实例字段。就像你的观点一样。如果要引用它,请在类的构造函数中初始化ICommand _Add_行。每次调用非静态字段或方法时,都需要该类的实例来获取其值。
关于这个问题,在

上有几个答案对不起,我累了,你这是什么意思DError:字段初始值设定项无法引用非静态字段、方法或属性“WpfApplication1.ViewModel.View_uu.get”我正试图将文本框字符串添加到我的ObservableCollection“View_u”中,我还没有绑定。我不明白,你能给我一个小例子吗?我想你忘了backing字段。请尝试上面的代码。:)对不起,我累了,你这是什么意思DError:字段初始值设定项无法引用非静态字段、方法或属性“WpfApplication1.ViewModel.View_uu.get”我正试图将文本框字符串添加到我的ObservableCollection“View_u”中,我还没有绑定。我不明白,你能给我一个小例子吗?我想你忘了backing字段。请尝试上面的代码。:)是的,你使用的这种“编码惯例”不是我喜欢的。为什么不是一个简单的骆驼案?!基本上是因为我是来自Windows窗体的WPF新手,几个月前我开始使用Windows窗体,IDK什么是camelCase。忘了《宪章》吧。我没有看过那么多Windows窗体代码,但我知道它不是C#的最爱。当一个标识符由多个单词组成时,不要使用分隔符,例如下划线(“\”)或连字符(“-”)