WPF.NET无法将新实例添加到ObservableCollection



我是WPF的新手,对问题失去了理智。我有一个视图、视图模型和模型。我希望用户用户在视图中填写一些信息,按下按钮进行确认,然后将模型的新实例(带有用户指定的参数(添加到ObservableCollection和我的本地数据库中。

查看:(不相关的东西隐藏(

<TextBox DataContext="{DynamicResource RiderequestViewModel}" Margin="15,0,15,0" Grid.Column="1" Grid.Row="1" FontSize="12" Height="25" Text="{Binding Riderequest.Time}"/>

<TextBox DataContext="{DynamicResource RiderequestViewModel}" Margin="15,0,15,0" Grid.Column="1" Grid.Row="2" FontSize="12" Height="25" Text="{Binding Riderequest.LocationFrom}"/>

<TextBox DataContext="{DynamicResource RiderequestViewModel}" Margin="15,0,15,0" Grid.Column="1" Grid.Row="3" FontSize="12" Height="25" Text="{Binding Riderequest.LocationTo}"/>
<Button DataContext="{DynamicResource RiderequestViewModel}" x:Name="nextBtn" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="5" Content="Verder" Width="150" Foreground="White" Command="{Binding AddRiderequestCommand}" Click="NextBtn_Click"/>

ViewModel RiderequestViewModel:

namespace Drink_n_Drive.ViewModel
{
class RiderequestViewModel: BaseViewModel
{
private Riderequest riderequest;
private ObservableCollection<Riderequest> riderequests;

public ObservableCollection<Riderequest> Riderequests
{
get
{
return riderequests;
}
set
{
riderequests= value;
NotifyPropertyChanged();
}
}
public Riderequest Riderequest 
{
get
{
return riderequest;
}
set
{
riderequest= value;
NotifyPropertyChanged();
}
}

public ICommand AddRiderequestCommand { get; set; }
public ICommand ChangeRiderequestCommand { get; set; }
public ICommand DeleteRiderequestCommand { get; set; }

public RiderequestViewModel()
{
LoadRiderequests();    //load existing from DB
LinkCommands();     //Link ICommands with BaseCommands
}
private void LoadRiderequests()
{
RiderequestDataService riderequestDS = new RiderequestDataService();
Riderequests= new ObservableCollection<Riderequests>(riderequestDS .GetRiderequests());
}
private void LinkCommands()
{
AddRiderequestCommand = new BaseCommand(Add);
ChangeRiderequestCommand = new BaseCommand(Update);
DeleteRiderequestCommand = new BaseCommand(Delete);
}
private void Add() 
{
RiderequestDataService riderequestDS = new RitaanvraagDataService();
riderequestDS.InsertRiderequest(riderequest);     //add single (new) instance to the DB
LoadRiderequests();        //Reload ObservableCollection from DB
}
private void Update()
{
if (SelectedItem != null)
{
RiderequestDataService riderequestDS = new RiderequestDataService();
riderequestDS.UpdateRiderequest(SelectedItem);
LoadRiderequests();    //refresh
}
}
private void Delete()
{
if (SelectedItem != null)
{
RiderequestDataService riderequestDS = new RiderequestDataService();
riderequestDS.DeleteRiderequest(SelectedItem);
LoadRiderequests();
}
}
private Riderequest selectedItem;
public Riderequest SelectedItem
{
get { return selectedItem; }
set
{
selectedItem = value;
NotifyPropertyChanged();
}
}
}
}

按下按钮根本没有任何作用,我不知道为什么。我还有一个不同的页面,我想在这里显示ObservableCollection中所有实例的数据网格,如下所示:

<DataGrid Grid.Row="1" Grid.ColumnSpan="2" Grid.RowSpan="3" DataContext="{DynamicResource RitaanvragenViewModel}" ItemsSource="{Binding Ritaanvragen}" SelectedItem="{Binding SelectedItem}" />

但是网格显示完全是空的。我在数据库中添加了一些dummydata,但仍然不起作用。

我对代码中英语和荷兰语的混合使用表示赞同。

我不能100%确定,但我会做这样的事情:

至于第一步,我会把文本框改成这样:

<TextBox DataContext="{DynamicResource Ritaanvraag}" Margin="15,0,15,0" Grid.Column="1" Grid.Row="1" FontSize="12" Height="25" Text="{Binding Path=Time, Mode=OneWayToSource}"/>

没有必要将ViewModel作为DataSource传递给它,因为视图的前几行元数据相关行应该已经定义了它属于什么ViewModel。

如果您没有指定绑定的类型,它将使用依赖于当前对象的默认绑定类型。您现在使用的是TextBox,因此默认情况下它将具有TwoWay绑定。

如果你只想接受用户的数据,而不想显示数据(如果你的模型有(,那么你应该使用OneWayToSource。(注意:单向是源->视图之间的方向。(

我也会从你的DataGrid中删除DataSource,因为你已经设置了它的ItemSource:

<DataGrid Grid.Row="1" Grid.ColumnSpan="2" Grid.RowSpan="3" ItemsSource="{Binding Ritaanvragen}" SelectedItem="{Binding SelectedItem}" />

最新更新