Mam kolekcję obiektów przechowywanych w CollectionViewSource
i związanych z DataGrid
. Chcę wyświetlić "szczegółowy widok" obiektu aktualnie wybranego w DataGrid
. Mogę uzyskać bieżący obiekt za pomocą CollectionViewSource.View.CurrentItem
.WPF: Dynamiczne wiązanie listy do (niektórych) właściwości obiektu
MyClass
{
[IsImportant]
AProperty{}
AnotherProperty{}
[IsImportant]
YetAnotherProperty{}
}
Co chciałbym zrobić, to wyświetlacz etykieta (z nazwą własności) oraz sterowanie (do edycji) w listbox, dla każdej z tych właściwości oznaczone atrybutemIsImportant
. Powiązanie musi działać między wprowadzonymi zmianami, DataGrid i obiektem podkładu. Wyświetlona kontrola powinna być różna w zależności od typu właściwości, która może być boolean
, string
lub IEnumerable<string>
(napisałem IValueConverter
, aby przekonwertować ciąg wyliczalny i znakowany nowymi liniami).
Czy ktoś wie o metody realizacji tego? Mogę obecnie wyświetla wartości każdej nieruchomości przez następujące, ale edytowanie ich nie aktualizuje obiekt Podłoże:
listBox.ItemsSource = from p in typeof(MyClass).GetProperties()
where p.IsDefined(typeof(IsImportant), false)
select p.GetValue(_collectionViewSource.View.CurrentItem, null);
do wyjaśnienia, chciałbym aby tak się stało „automagicznie”, bez konieczności ręcznego określania nazwy właściwości w XAML. Jeśli mogę dynamicznie dodawać do XAML w czasie wykonywania w oparciu o które właściwości są oznaczone atrybutami, byłoby to również w porządku.
To wygląda fantastycznie; Zaimplementuję to tak szybko, jak tylko będę miał szansę i dam ci znać, jak to działa. Dzięki! –
Działa to głównie świetnie. Właśnie dodałem zerowy czek do PropertyValueConverter, ponieważ otrzymywał obiekt zerowy po pierwszym ustawieniu wiązania. Jedynym problemem jest to, że obecnie, jeśli zmienię wartość tej kontrolki, nie zostanie ona przekazana do datagridu. Prawdopodobnie zmienia się obiekt podkładu, ponieważ zmieniona wartość jest nadal pokazywana przez sterowanie elementami, ale siatka nie jest powiadamiana. Czy ma to związek z Binding.DoNothing? –
@Daniel: Twój obiekt będzie musiał zaimplementować INotifyPropertyChanged, jeśli chcesz, aby aktualizacje wykonane przez jedną kontrolkę znalazły odzwierciedlenie w innych kontrolkach powiązanych z tą samą usługą. Będziesz także musiał wdrożyć INotifyPropertyChanged na PropertyValue. Właściwość PropertyValueConverter dotyczy samego powiązania ItemsSource, które jest jednokierunkowe, więc ConvertBack nie zostanie wywołane, a funkcja Binding.DoNothing nie będzie miała znaczenia. – Quartermeister