Feignons je le XAML suivant ...Silverlight Databinding - Liaison d'un ValueConverter à une propriété sur une vue modèle
<UserControl.Resources>
<local:ViewModel x:Name="viewModel" />
<local:LoadChildrenValueConverter x:Name="valueConverter" />
</UserControl.Resources>
<UserControl.DataContext>
<Binding Source="{StaticResource viewModel}" />
</UserControl.DataContext>
<Grid x:Name="LayoutRoot" Background="White">
<control:TreeView ItemsSource="{Binding Root}">
<control:TreeView.ItemTemplate>
<control:HierarchicalDataTemplate ItemsSource="{Binding Converter={StaticResource valueConverter}}">
<TextBlock Text="{Binding}" />
</control:HierarchicalDataTemplate>
</control:TreeView.ItemTemplate>
</control:TreeView>
</Grid>
... et le code suivant aller avec elle ...
using System; using System.Collections.ObjectModel; using System.Windows.Data; namespace SilverlightViewModelSpike { public class ViewModel { public ViewModel() { Root = new ObservableCollection() { "Item 1", "Item 2", "Item 3", }; } public ObservableCollection Root { get; private set; } } public class LoadChildrenValueConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return new ObservableCollection() { "Item 1", "Item 2", "Item 3", }; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } }
Cela fonctionne comme prévu, mais il se sent mal que j'ai deux classes distinctes qui sont nécessaires pour saisir les données nécessaires à mon affichage (imaginez que ViewModel et LoadChildrenValueConverter extraient des données d'un service Web au lieu de renvoyer des données codées en dur). Y a-t-il une meilleure solution ici? Je pensais peut-être quelque chose comme ça ...
using System; using System.Collections.ObjectModel; using System.Windows.Data; namespace SilverlightViewModelSpike { public class ViewModel { public ViewModel() { Root = new ObservableCollection() { "Item 1", "Item 2", "Item 3", }; ValueConverter = new LoadChildrenValueConverter(); } public ObservableCollection Root { get; private set; } public LoadChildrenValueConverter ValueConverter { get; private set; } } public class LoadChildrenValueConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return new ObservableCollection() { "Item 1", "Item 2", "Item 3", }; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } }
... mais je ne peux pas obtenir cette ligne de travail ...
<control:HierarchicalDataTemplate ItemsSource="{???}"
>
... et même que Cela ne semble pas être une bonne solution. Est-ce que quelqu'un a une bonne solution propre pour cela?
C'est un peu ce que je veux dire. Cependant, je ne pense pas que Silverlight permette x: Static dans les bindings. N'est-ce pas vrai? – herbrandson
Ah vous avez raison. Je n'avais pas remarqué que vous aviez étiqueté votre question comme Silverlight. Je vais ajouter une option supplémentaire à la réponse juste au cas où c'est viable pour vous. –
Merci pour l'aide. L'idée que vous présentez dans Edit2 est réellement là où j'ai commencé. J'espérais qu'il y avait une solution plus propre, mais je ne semble pas l'être à ce stade. Cela aide certains à voir quelqu'un d'autre arriver à la même conclusion. Au moins, je ne me sens pas comme une solution stupide :) – herbrandson