Silverlight 3.0 personalizzato ListBox DataTemplate ha una casella di controllo, evento registrato non sparare
-
26-09-2019 - |
Domanda
Il DataTemplate per la ListBox è impostata in modo dinamico dalla XamlReader.Load. Desidero registrarmi alle manifestazione Controllato da ottenere l'oggetto CheckBox utilizzando VisualTreeHelper.GetChild. Questo evento non è essere stato licenziato
Snippet di codice
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;
}
Come gestire l'evento controllato? Si prega di aiuto
Soluzione 2
Rimosso ItemTemplate e ha aggiunto la sottostante Codice
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()); };
Questo risolto il problema
Altri suggerimenti
È necessario capire il motivo per cui è un ItemTemplate
DataTemplate
. Per ogni articolo la casella della lista deve visualizzare chiamerà il metodo LoadContent (). Questo crea una nuova istanza del contenuto descritto compresi, in questo caso, una nuova casella. Tutto questo poi viene legato alla voce quando viene assegnato come il contenuto di un ListBoxItem.
Tutte le istanze di casella di controllo in questo caso sono oggetti indipendenti. Tutto quello che avete fatto è stato creato l'ennesimo esempio indipendente che non viene utilizzato in qualsiasi parte del reale interfaccia utente e attaccato un gestore di eventi ad esso. Nessuna delle caselle di controllo per gli elementi dell'elenco condividerà questo gestore da cui il codice evento non viene mai chiamato.