Silverlight 3.0 encargo ListBox DataTemplate tiene una casilla de verificación, caso facturado no disparar
-
26-09-2019 - |
Pregunta
El DataTemplate para el ListBox se establece dinámicamente por XamlReader.Load. Me inscribo a eventos Revisado por conseguir el objeto CheckBox usando VisualTreeHelper.GetChild. Este evento no es ser despedido
Fragmento de código
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;
}
Cómo controlar el evento registrado? Por favor, ayuda
Solución 2
Se ha quitado ItemTemplate y añadido el siguiente código
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()); };
Esto fija el tema
Otros consejos
Es necesario comprender la razón por la ItemTemplate
es un DataTemplate
. Para cada elemento del cuadro de la lista tiene que mostrar que llamará al método LoadContent (). Esto crea una nueva instancia del contenido de describir, que incluye, en este caso, una casilla de verificación nueva. Todo esto, entonces se une al elemento cuando se asigna como el contenido de un ListBoxItem.
Todas las instancias de casilla de verificación en este caso son objetos independientes. Todo lo que ha hecho se crea una nueva instancia independiente que no se utiliza en cualquier parte de la interfaz de usuario actual y adjunta un controlador de eventos a la misma. Ninguna de las casillas de verificación de los elementos de la lista compartirá este controlador de ahí el código de evento nunca es llamado.