#wpf #list #binding #static
#wpf #Список #привязка #статический
Вопрос:
ПРИВЕТ, у меня есть список пройденных курсов с датами (возвращаемый вложенным классом). Поскольку я не уверен, сколько курсов прошел этот человек, я просто привязываю его к текстовым полям, и он работает нормально. Datacontext сетки — это сам список, поэтому я предполагаю, что всякий раз, когда я вношу изменения в форму, он автоматически отправляется обратно в список и добавляет его, но когда придет время сохранить его в DB, список не изменится. Я попытался создать список как наблюдаемую коллекцию и режим двусторонней привязки, но все равно ничего не изменится. когда я пытаюсь включить Propertychange, он говорит «Не удается получить доступ к нестатическому члену внешнего типа через вложенный тип …» Что я хочу делать, так это всякий раз, когда я набираю / добавляю что-то в текстовое поле, список будет добавлять это как n-й элемент, чтобы я мог выполнить итерацию и сохранить его в БД.
есть ли какой-нибудь другой способ сделать это? пожалуйста, смотрите код ниже. Спасибо!
#region class for binding purposes (nested class)
public class ListCon
{
public ObservableCollection<tblGALContinuingEducationHistory> EducList
{
get
{
return new ObservableCollection<tblGALContinuingEducationHistory>(contEducHstoryList);
}
}
}
#endregion
#region constructor
public ContinuingEducHistoryPopUp(tblAttorneyGalFileMaint currentGal)
{
contEducHstoryList = new ObservableCollection<tblGALContinuingEducationHistory>();
InitializeComponent();
if (currentGal != null)
{
CurrentGal = currentGal;
txtMemberName.Text = CurrentGal.FullName;
contEducHstoryList = new ObservableCollection<tblGALContinuingEducationHistory>(currentGal.tblGALContinuingEducationHistories.Count > 0 amp;amp; currentGal.tblGALContinuingEducationHistories != null ? currentGal.tblGALContinuingEducationHistories : null);
}
this.DataContext = new ListCon();
}
#endregion
Теперь вот мой xaml
<Grid Grid.Row="2" Grid.ColumnSpan="2" Name="grdEducForm">
<Grid.RowDefinitions>
<RowDefinition Height="25" />
<RowDefinition Height="25" />
<RowDefinition Height="25" />
<RowDefinition Height="25" />
<RowDefinition Height="25" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBox Text="{Binding Path=EducList[0].CourseTitle}" Grid.Column="0" Grid.Row="0" />
<useable:MaskedDatePicker DateValue="{Binding Path=EducList[0].CertificateDate}" Grid.Column="1" Grid.Row="0" />
<useable:MaskedDatePicker DateValue="{Binding Path=EducList[0].CertificateExpiration}" Grid.Column="2" Grid.Row="0" />
<TextBox Text="{Binding EducList[1].CourseTitle}" Grid.Column="0" Grid.Row="1" />
<useable:MaskedDatePicker DateValue="{Binding Path=EducList[1].CertificateDate}" Grid.Column="1" Grid.Row="1" />
<useable:MaskedDatePicker DateValue="{Binding Path=EducList[1].CertificateExpiration}" Grid.Column="2" Grid.Row="1" />
<TextBox Text="{Binding Path=EducList[2].CourseTitle}" Grid.Column="0" Grid.Row="2" />
<useable:MaskedDatePicker DateValue="{Binding Path=EducList[2].CertificateDate}" Grid.Column="1" Grid.Row="2" />
<useable:MaskedDatePicker DateValue="{Binding Path=EducList[2].CertificateExpiration}" x:Name="dpEnd3"
Grid.Column="2" Grid.Row="2" />
<TextBox Text="{Binding Path=EducList[3].CourseTitle, Mode=TwoWay}" Grid.Column="0" Grid.Row="3" />
<useable:MaskedDatePicker DateValue="{Binding Path=EducList[3].CertificateDate, Mode=TwoWay}" Grid.Column="1"
Grid.Row="3" />
<useable:MaskedDatePicker DateValue="{Binding Path=EducList[3].CertificateExpiration}" Grid.Column="2" Grid.Row="3" />
<TextBox Text="{Binding Path=EducList[4].CourseTitle}" Name="txtEducName5" Grid.Column="0" Grid.Row="4" />
<useable:MaskedDatePicker DateValue="{Binding Path=EducList[4].CertificateDate}" x:Name="dpStart5" Grid.Column="1"
Grid.Row="4" />
<useable:MaskedDatePicker DateValue="{Binding Path=EducList[4].CertificateExpiration}" x:Name="dpEnd5"
Grid.Column="2" Grid.Row="4" />
</Grid>
Комментарии:
1. Есть ли причина, по которой я не понимаю, почему ваше свойство EducList возвращает nwe ObservableCollection при каждом обращении к нему?
2. на самом деле я преобразовывал contEducHstoryList в observablecolelction, поскольку это объект, который можно перечислить.
3. Вы преобразуете его в своем конструкторе (фактически дважды), а затем также создаете его при каждом обращении к этому свойству. Определенно не так.
4. Понятно, позвольте мне пересмотреть мой код. попытаюсь посмотреть, что решает мою проблему, используя идею, которую вы мне дали. спасибо.
Ответ №1:
В вашем свойстве ListCon вы всегда возвращаете новую коллекцию, это лишает смысла наличие ObservableCollection вообще, вы должны хранить его в поле, подобном этому:
//Initialize field in constructor
private readonly ObservableCollection<tblGALContinuingEducationHistory> _ListCon;
public ObservableCollection<tblGALContinuingEducationHistory> ListCon
{
get
{
return _ListCon;
}
}
Комментарии:
1. неважно, разобрался. для тех, кто ищет способ сделать это, просто добавьте новый экземпляр объекта в список, но сохраните только те, в которых есть данные о нем.
Ответ №2:
EducList = new ObservableCollection<tblGALContinuingEducationHistory>(currentGal.tblGALContinuingEducationHistories.Count > 0 amp;amp; currentGal.tblGALContinuingEducationHistories != null ? currentGal.tblGALContinuingEducationHistories : null);
int count = 0;
//5 is the maximum no of course an atty can take and save in this form
count = 5 - EducList.Count;
for (int i = 0; i < count; i )
{
galContEdu = FileMaintenanceBusiness.Instance.Create<tblGALContinuingEducationHistory>();
galContEdu.AttorneyID = currentGal.AttorneyID;
EducList.Add(galContEdu);
}
затем сохраните только те, в которых есть данные:
foreach (var item in EducList)
{
if(!string.IsNullOrEmpty(item.CourseTitle) || !string.IsNullOrWhiteSpace(item.CourseTitle))
FileMaintenanceBusiness.Instance.SaveChanges(item, true);
}