Привязка текстового поля к списку не будет обновляться - PullRequest
0 голосов
/ 03 июня 2011

HI, У меня есть список курсов, взятых с датами (возвращается вложенным классом). Поскольку я не уверен, сколько человек прошел курсы, я просто привязал его к текстовым полям и работает нормально. Текст данных сетки представляет собой сам список, поэтому я предполагаю, что всякий раз, когда я изменяю форму, она автоматически отправляется обратно в список и добавляется в нее, но когда придет время сохранить ее в БД, список не изменится. Я попытался сделать список как наблюдаемую коллекцию и режим связывания двумя способами, но все равно не изменился. когда я пытаюсь поместить Onpropertychange, он говорит: «Невозможно получить доступ к нестатическому члену внешнего типа через вложенный тип ...» Я хочу сделать, когда бы я ни вводил / добавлял что-то в текстовое поле, список добавлял его как 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 && 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>

Ответы [ 2 ]

2 голосов
/ 03 июня 2011

В своем свойстве ListCon вы всегда возвращаете новую коллекцию, которая вообще не имеет смысла иметь ObservableCollection, вы должны хранить ее в поле, подобном этому:

//Initialize field in constructor
private readonly ObservableCollection<tblGALContinuingEducationHistory> _ListCon;
public ObservableCollection<tblGALContinuingEducationHistory> ListCon
{
    get
    {
        return _ListCon;
    }
}
0 голосов
/ 06 июня 2011
EducList = new ObservableCollection<tblGALContinuingEducationHistory>(currentGal.tblGALContinuingEducationHistories.Count > 0 && 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);
            }
...