Silverlight 3.0 ListBox personnalisée DataTemplate a une case à cocher, événements cochés pas de tir
-
26-09-2019 - |
Question
Le DataTemplate pour la zone de liste est réglé de façon dynamique par XamlReader.Load. Je suis inscrire à l'événement Vérifié en obtenant l'objet CheckBox à l'aide VisualTreeHelper.GetChild. Cet événement ne reçoit pas tiré
Code Snippet
public void SetListBox()
{
lstBox.ItemTemplate =
XamlReader.Load(@"<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' x:Name=""DropDownTemplate""><Grid x:Name='RootElement'><CheckBox x:Name='ChkList' Content='{Binding " + TextContent + "}' IsChecked='{Binding " + BindValue + ", Mode=TwoWay}'/></Grid></DataTemplate>") as DataTemplate;
CheckBox chkList = (CheckBox)GetChildObject((DependencyObject)_lstBox.ItemTemplate.LoadContent(), "ChkList");
chkList.Checked += delegate { SetSelectedItemText(); };
}
public CheckBox GetChildObject(DependencyObject obj, string name)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject c = VisualTreeHelper.GetChild(obj, i);
if (c.GetType().Equals(typeof(CheckBox)) && (String.IsNullOrEmpty(name) || ((FrameworkElement)c).Name == name))
{
return (CheckBox)c;
}
DependencyObject gc = GetChildObject(c, name);
if (gc != null)
return (CheckBox)gc;
}
return null;
}
Comment gérer l'événement contrôlé? S'il vous plaît aider
La solution 2
Suppression ItemTemplate et ajouté le code ci-dessous
var checkBox = new CheckBox { DataContext = item };
if (string.IsNullOrEmpty(TextContent)) checkBox.Content = item.ToString();
else
checkBox.SetBinding(ContentControl.ContentProperty,
new Binding(TextContent) { Mode = BindingMode.OneWay });
if (!string.IsNullOrEmpty(BindValue))
checkBox.SetBinding(ToggleButton.IsCheckedProperty,
new Binding(BindValue) { Mode = BindingMode.TwoWay });
checkBox.SetBinding(IsEnabledProperty, new Binding("IsEnabled") { Mode = BindingMode.OneWay });
checkBox.Checked += (sender, RoutedEventArgs) => { SetSelectedItemText(true, ((CheckBox)sender).GetValue(CheckBox.ContentProperty).ToString()); };
checkBox.Unchecked += (sender, RoutedEventArgs) => { SetSelectedItemText(true, ((CheckBox)sender).GetValue(CheckBox.ContentProperty).ToString()); };
Correction du problème
Autres conseils
Vous devez comprendre la raison pour laquelle ItemTemplate
est un DataTemplate
. Pour chaque élément de la liste de la boîte doit afficher appellera la méthode LoadContent (). Cela crée une nouvelle instance du contenu décrit notamment, dans ce cas, une nouvelle case à cocher. Tout cela se lie alors à l'élément lorsqu'il est désigné comme le contenu d'un ListBoxItem.
Toutes les instances de case à cocher dans ce cas sont des objets indépendants. Tout ce que vous avez fait est créé encore une autre instance indépendante qui est utilisée nulle part dans l'interface utilisateur réelle et joint un gestionnaire d'événements à elle. Aucun des cases à cocher pour les éléments de la liste partagera ce gestionnaire d'où le code d'événement est jamais appelé.