App Silverlight 3 con un controllo TabControl associato a ObservableCollection utilizzando un IValueConverter. Iniziale il collegamento funziona (convertitore chiamato) all'avvio dell'app. Le modifiche, Clear() o Add(), alla raccolta associata non si riflettono nel convertitore TabControl ... non chiamato.Silverlight TabControl associato a ObservableCollection <string> non si aggiorna quando la raccolta è cambiata
nota: il ListBox associato riflette le modifiche alla raccolta associata mentre TabControl non lo fa.
Idee?
/jhd
Il XAML vincolante ...
<UserControl.Resources>
<local:ViewModel x:Key="TheViewModel"/>
<local:TabConverter x:Key="TabConverter" />
</UserControl.Resources>
<StackPanel DataContext="{StaticResource TheViewModel}">
<ListBox ItemsSource="{Binding Classnames}" />
<controls:TabControl x:Name="TheTabControl"
ItemsSource="{Binding Classnames, Converter={StaticResource TabConverter}, ConverterParameter=SomeParameter}"/>
<Button Click="Button_Click" Content="Change ObservableCollection" />
</StackPanel>
Il ViewModel ...
namespace DatabindingSpike
{
public class ViewModel
{
private ObservableCollection<string> _classnames = new ObservableCollection<string>();
public ViewModel()
{
_classnames.Add("default 1 of 2");
_classnames.Add("default 2 of 2");
}
public ObservableCollection<string> Classnames
{
get { return _classnames; }
set { _classnames = value; }
}
}
}
Il convertitore (per completezza) ...
namespace DatabindingSpike
{
public class TabConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var source = value as ObservableCollection<string>;
if (source == null)
return null;
var param = parameter as string;
if (string.IsNullOrEmpty(param) || param != "SomeParameter")
throw new NotImplementedException("Null or unknow parameter pasased to the tab converter");
var tabItems = new List<TabItem>();
foreach (string classname in source)
{
var tabItem = new TabItem
{
Header = classname,
Content = new Button {Content = classname}
};
tabItems.Add(tabItem);
}
return tabItems;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
C'è qualche possibilità la modalità predefinita è OneTime? Proverà a impostare la modalità in modo esplicito. /jhd –
Provato modalità esplicita = OneWay, nessuna gioia. Userò l'evento CollectionChanged e reimposterò TabControl.ItemsSource finché non avrò trovato un modo migliore./jhd –
Ho creato il controllo scheda estesa che funziona correttamente con la classe ObservableCollection. http://vortexwolf.wordpress.com/2011/04/09/silverlight-tabcontrol-with-data-binding/ – vorrtex