我正在学习一个简单的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”));
答案 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
在这个问题上有几个答案