我正在使用WPF创建一个应用程序,以使组织能够在应用程序中输入不同的数据。我有一个选项卡控件,允许他们这样做。
然后在一个单独的视图中,我有一系列不同的数据网格,向用户显示他们插入数据库的数据。包含按钮,添加,更新或删除他们想要的数据。
这引出了我的问题。目前,我能够轻松删除和添加数据,没有任何问题。但接下来我的问题是尝试让selected
项更新,而不是null reference exception
。
如果我以编程方式设置我的属性属性,它会更新它。像这样; public int _OrganisationTypeDetailID = 17;
public int _OrganisationTypeID = 1;
但我不想要这个,因为我希望用户能够自己选择并更新他们需要的数据。
以下是一些可能有助于解决我的问题的代码;
查看模型;
public void UpdateOrganisationTypeDetail(OrganisationTypeDetail orgTypeDetail)
{
using (DBEntities context = new DBEntities())
{
var orgTD = context.OrganisationTypeDetails.Where(otd => otd.OrganisationTypeDetailID == SelectedType.OrganisationTypeDetailID).FirstOrDefault();
if (orgTD != null)
{
orgTD.Title = Title;
orgTD.FirstName = FirstName;
orgTD.Surname = Surname;
orgTD.Position = Position;
orgTD.DateOfBirth = DateOfBirth;
orgTD.Address = Address;
orgTD.Country = Country;
orgTD.Postcode = Postcode;
orgTD.PhoneNumber = PhoneNumber;
orgTD.MobileNumber = MobileNumber;
orgTD.FaxNumber = FaxNumber;
orgTD.Email = Email;
orgTD.NINumber = NINumber;
//context.OrganisationTypeDetails.Attach(orgTD);
context.OrganisationTypeDetails.ApplyCurrentValues(orgTD);
context.SaveChanges();
MessageBox.Show("Updated Organisation Type Details");
}
else
{
MessageBox.Show("Unable to update selected 'Type'.");
}
}
private OrganisationTypeDetail _SelectedType;
public OrganisationTypeDetail SelectedType
{
get
{
return _SelectedType;
}
set
{
if (_SelectedType == value)
return;
_SelectedType = value;
OnPropertyChanged("SelectedType");
}
}
public List<OrganisationTypeDetail> GetOrganisationTypeDetail //Loads data
{
get
{
using (DBEntities context = new DBEntities())
{
var query = from e in context.OrganisationTypeDetails
select e;
return query.ToList<OrganisationTypeDetail>();
}
}
}
private ICommand showUpdateCommand;
public ICommand ShowUpdateCommand //Update command
{
get
{
if (showUpdateCommand == null)
{
showUpdateCommand = new RelayCommand(this.UpdateFormExecute, this.UpdateFormCanExecute); //i => this.UpdateOrganisationTypeDetail()
}
return showUpdateCommand;
}
}
代码背后;
private void btnUpdateOrgTypeDetail_Click(object sender, RoutedEventArgs e)
{
OrganisationTypeDetail selected = dgOrgTypeDetail.SelectedItem as OrganisationTypeDetail;
OrganisationTypeDetailViewModel org = new OrganisationTypeDetailViewModel();
if (selected == null)
MessageBox.Show("You must select a 'Type' before updating.");
else
{
OrganisationTypeDetailUpdateView update = new OrganisationTypeDetailUpdateView();
update.ShowDialog();
org.UpdateOrganisationTypeDetail(selected);
Page_Loaded(null, null);
}
}
XAML;
<DataGrid Name="dgOrgTypeDetail" Height="145" Width="555"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding GetOrganisationTypeDetail}"
SelectedItem="{Binding SelectedType, Mode=TwoWay}">
希望能解决这个问题。
答案 0 :(得分:0)
我想说你最好的选择就是在MVVM模式中使用命令来实现这个目的。 看起来你正在使用MVVM和代码隐藏的组合,并且实际上在点击事件触发时创建视图模型的新实例。尝试在视图后面的代码中将视图模型绑定到视图一次作为datacontext,然后尝试更新所选类型。
此外,当您尝试对SelectedType进行更新时 - 使用Snoop查看您的视图 - 查看SelectedType属性是否仍然绑定到视图。
ICommand UpdateOrgTypeDetail { get;}
然后在视图模型构造函数中声明新实例
UpdateOrgTypeDetail = new DelegateCommand<object>(ExecuteUpdateOrgTypeDetail, CanExecuteUpdateOrgTypeDetail);
然后这两个代表将允许您单击按钮(需要绑定到UpdateOrgTypeDetail)
<Button Command="{Binding UpdateOrgTypeDetail}" />
您应该会发现该属性的更新已从此处正确完成。