У меня есть два класса:
public class Person
{
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
public ObservableCollection<AccountDetail> Details
{
get { return details; }
set { details = value; }
}
public ObservableCollection<AccountDetail> Phones
{
get
{
ObservableCollection<AccountDetail> phones;
phones = new ObservableCollection<AccountDetail>();
foreach (AccountDetail detail in Details)
{
if (detail.Type == DetailType.Phone)
{
phones.Add(detail);
}
}
return phones;
}
set
{
ObservableCollection<AccountDetail> phones;
phones = value;
foreach (AccountDetail detail in Details)
{
if (detail.Type == DetailType.Phone)
{
Details.Remove(detail);
}
}
foreach (AccountDetail detail in phones)
{
if (!string.IsNullOrEmpty(detail.Value))
{
Details.Add(detail);
}
}
}
}
private string firstName;
private string lastName;
private ObservableCollection<AccountDetail> details;
}
и
public class AccountDetail
{
public DetailType Type
{
get { return type; }
set { type = value; }
}
public string Value
{
get { return this.value; }
set { this.value = value; }
}
private DetailType type;
private string value;
}
В моем файле XAML есть ListBox
с именем PhonesListBox, который является данными, привязанными к списку телефонов (свойствообъекта Person
):
<Window.Resources>
<!-- Window controller -->
<contollers:PersonWindowController
x:Key="WindowController" />
</Window.Resources>
...
<ListBox
Name="PhonesListBox"
Margin="0,25,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Top"
ItemsSource="{Binding Path=SelectedPerson.Phones,
Source={StaticResource ResourceKey=WindowController}}"
HorizontalContentAlignment="Stretch" />
...
В коде класса есть обработчик для кнопки, которая добавляет новый элемент к этому PhonesListBox:
private void AddPhoneButton_Click(object sender, RoutedEventArgs e)
{
ObservableCollection<AccountDetail> phones;
phones = (ObservableCollection<AccountDetail>)PhonesListBox.ItemsSource;
phones.Add(new AccountDetail(DetailType.Phone));
}
Проблема заключается в том, чтовновь добавленный элемент списка не добавляется в наблюдаемую коллекцию сведений о человеке, т. е. свойство Phones не обновляется (set
никогда не вызывается).Зачем?Где я делаю ошибку?
Спасибо за помощь.
ОБНОВЛЕНИЕ: я изменил метод AddPhoneButton_Click на:
private void AddPhoneButton_Click(object sender, RoutedEventArgs e)
{
PersonWindowController windowController;
ObservableCollection<AccountDetail> details;
windowController = (PersonWindowController)this.FindResource("WindowController");
details = windowController.SelectedPerson.Details;
details.Add(new AccountDetail(DetailType.Phone));
}
Это обновляет соответствующую коллекцию, которая details
не Phones
(так как телефоны просто вид или получатель подмножества деталей).Кроме того, я понял, что мне даже не нужен установщик телефонов.Проблема, с которой я сейчас сталкиваюсь, заключается в том, что мой пользовательский интерфейс не обновляется с изменениями, внесенными в коллекцию данных (и впоследствии в телефоны).Я не знаю, как и где позвонить, чтобы поменять недвижимость, так как не меняются ни детали, ни телефоны;члены их коллекции.Помогите.Пожалуйста.