Silverlight 3.0 Benutzerdefinierte ListBox Datatemplate hat eine Checkbox, geprüft Ereignis nicht ausgelöst
-
26-09-2019 - |
Frage
Die Datatemplate für die List-Box wird dynamisch durch XamlReader.Load. Ich bin an aufgegebenem Ereignis abonnieren, indem Sie das CheckBox-Objekt immer mit VisualTreeHelper.GetChild. Dieses Ereignis wird nicht gefeuert zu werden
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;
}
Wie das geprüfte Ereignis behandeln? Bitte Hilfe
Lösung 2
entfernt ItemTemplate und die folgenden Code
hinzugefügt 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()); };
Diese feste die Ausgabe
Andere Tipps
Sie müssen den Grund verstehen, warum ItemTemplate
ein DataTemplate
ist. Für jedes Element muss die das Listenfeld den Loadcontent () -Methode rufen anzuzeigen. Diese erstellen eine neue Instanz des Inhalts beschrieben, einschließlich in diesem Fall eine neue Checkbox. All dies dann wird auf das Element gebunden, wenn sie als Inhalt eines ListBoxItem zugeordnet ist.
Alle Instanzen von Kontrollkästchen in diesem Fall sind unabhängige Objekte. Alles, was Sie getan haben, ist noch eine weitere unabhängige Instanz geschaffen, die nicht überall in der aktuellen Benutzeroberfläche verwendet wird, und einen Ereignishandler mit ihm verbunden. Keine der Kontrollkästchen für die Elemente in der Liste wird diese Prozedur teilen daher der Ereigniscode nie aufgerufen wird.