INotifyPropertyChanged und ObservableCollection WPF
Nun habe ich einen Kalender, der zeigt nur einen Monat(je nach Monat, ich pass auf). Ich versuche, lassen die Benutzer wählen, welcher Monat und Jahr aus einer comboBox und den Kalender aktualisieren. Ich bin verbindlich mit observablecollection, die ich bin Art von kennt. Ich habe keine Ahnung, wie das INotifyPropertyChanged-funktioniert aber. Ich habe es nie benutzt, bevor. Hilfe oder Beratung wird sehr geschätzt. Dies ist, was ich habe, so weit:
public class Schedule : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void Update(int propertyName)
{
if (propertyName != null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler.Invoke(this, new PropertyChangedEventArgs(propertyName.ToString()));
}
}
//public void UpdateCal(PropertyChangedEventArgs e)
//{
// if (PropertyChanged != null)
// PropertyChanged(this, e);
// }
public string MonthWeek { get; set; }
public string Year { get; set; }
public string Month { get; set; }
public string day { get; set; }
public string WeekOfYear { get; set; }
public string dayofweek { get; set; }
//public string month {
// get {return Month; }
// set
// {
// UpdateCal(new PropertyChangedEventArgs("month"));
// }
//}
public int WeekNo { get; set; }
public int WeekDay { get; set; }
public DateTime Date { get; set; }
}
---Dies ist eine Klasse, die Figuren aus, um den Ort für jeden Zeitpunkt in der Startaufstellung----
public SchedulePage(MainWindow parentForm)
{
InitializeComponent();
pick = Convert.ToInt32(comboMonth.SelectedItem) + 1;
_parentForm = parentForm;
//DateTime date = new DateTime(year, month, day);
var t = new List<Schedule>();
DateTime curr = DateTime.Now;
// comboMonth.Items.Add(curr.Month);
DateTime newcurr = new DateTime(2011, pick, 1);
// pickdate = datePickercal.SelectedDate;
// DateTime newcurr = new DateTime(curr.Year, curr.Month, 1);
var cal = System.Globalization.DateTimeFormatInfo.CurrentInfo.Calendar;
var ms = cal.GetWeekOfYear(new DateTime(newcurr.Year, newcurr.Month, 1), System.Globalization.CalendarWeekRule.FirstDay, System.DayOfWeek.Sunday);
for (var i = 1; newcurr.Month == pick; newcurr = newcurr.AddDays(1))
{
var sched = new Schedule();
var month_week = (newcurr.Day / 7) ;
sched.MonthWeek = newcurr.GetWeekOfMonth().ToString();
sched.Month = newcurr.Month.ToString();
sched.Year = newcurr.Year.ToString();
sched.day = newcurr.Day.ToString();
sched.WeekOfYear = cal.GetWeekOfYear(newcurr, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString();
sched.dayofweek = newcurr.DayOfWeek.ToString();
t.Add(sched);
_parentForm.bindings.schedule.Add(new Schedule { WeekNo = newcurr.GetWeekOfMonth()-1, WeekDay = (int)newcurr.DayOfWeek, day = newcurr.Day.ToString() });
}
lblDate.Content = (newcurr.Month -1) + "/" + newcurr.Year;
DataContext = _parentForm.Bindings;
---Und diese Klasse macht die observablecollections-----
public partial class BindingCamper
{ //This class assist in binding campers from listview to the textboxes on the camperspage
public ObservableCollection<Camper> Campers { get; set; }
public ObservableCollection<Staff> StaffMembers { get; set; }
public ObservableCollection<Schedule> schedule { get; set; }
public BindingCamper()
{
Campers = new ObservableCollection<Camper>();
StaffMembers = new ObservableCollection<Staff>();
schedule = new ObservableCollection<Schedule>();
}
InformationsquelleAutor TMan | 2011-10-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, wie Sie typischerweise implementieren
INotifyPropertyChanged
:Im Grunde müssen Sie nur zum auslösen der
PropertyChanged
Ereignis jedes mal, wenn eine Eigenschaft aktualisiert wird, also alle setter-aufrufen mussOnPropertyChanged
. Beachten Sie, dass Sie es nicht mit automatisch implementierten Eigenschaften, da Sie benötigen, um eigene Logik in den setter.Wie kann man die INotifyPropertyChanged implementieren mit automatisch implementierten Eigenschaften?
sicher, Sie können rufen Sie OnPropertyChanged von überall in der Klasse, aber in diesem Fall gibt es keine Garantie, dass das event ausgelöst wird (z.B. wenn die Eigenschaft aktualisiert wird, von außerhalb der Klasse)
Nevermind, Thomas Kommentar gelöscht Dinge.
Der einzige Fall, wo ich nicht anrufen OnPropertyChanged in den setter für Eigenschaften, die berechnet werden und haben keinen getter. In diesem Fall nenne ich OnPropertyChanged für diese Eigenschaft, wenn ein Grundstück, auf dem es hängt, ist aktualisiert
InformationsquelleAutor Thomas Levesque
Beim binden einer Eigenschaft (auch wenn diese Eigenschaft eine ObservableCollection), werden alle änderungen an der IMMOBILIE (nicht die Inhalte der Immobilie) erheben sollten, das PropertyChanged-Ereignis.
ObservableCollection ist eigenständig, wenn es um die Erhöhung der CollectionChanged-Ereignis, also Mach dir keine sorgen über das versenden einer Veranstaltung für die ItemsSource-Elemente selbst.
XAML:
KLASSE:
}
Alternativ, wenn Sie BindingCamper ist der ViewModel dann tun Sie das gleiche in dort statt.
InformationsquelleAutor m-y
Wenn Sie eine Eigenschaft ändern von code-behind und du willst aktualisieren Sie Ihre UI dann verwenden Sie INotifyPropertyChanged-Schnittstelle. Wie ich sehe, Sie implementiert die Schnittstelle und sogar einen Helfer zu verwenden, es nur Sie verwendet einen int als parameter sollte ein string statt. Wenn Sie die Immobilie dann rufen Sie Ihre Helfer mit der rechten PropertyName und Sie sind gut zu gehen.
Wie diese:
Und zum auslösen des Ereignisses zu Benachrichtigen, UI:
Vielleicht werden Sie brauchen, um die TwoWay-Bindung zu, aber das ist nur true, wenn Sie wollen, ändern Sie die Eigenschaft über die Benutzeroberfläche zu.
InformationsquelleAutor BigL