Silverlight 3.0 Пользовательский список данных DataTembless имеет флажок, проверенное событие не стрельба
-
26-09-2019 - |
Вопрос
DataTemplate для ListBox динамически устанавливается XAMLREADER.Load. Я подписываюсь на проверенное событие, получив объект Checkbox, используя VisualTreeHelper.GetChild. Это событие не уволено
Кодовый фрагмент
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;
}
Как обрабатывать проверенное событие? Пожалуйста помоги
Решение 2
Удалил itemTemplate и добавил код ниже
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()); };
Это исправлено проблему
Другие советы
Вы должны понять причину, почему ItemTemplate
это DataTemplate
. Отказ Для каждого элемента необходимо отобразить флажок «Список списка», позвонит методу LastContent (). Это создает новый экземпляр описанного содержимого, включая в этом случае новый флажок. Все это затем связано с элементом, когда оно присваивается как содержимое listboxItem.
Все экземпляры флажков в этом случае являются независимыми объектами. Все, что вы сделали, создано еще один независимый экземпляр, который не используется нигде в реальном пользовательском интерфейсе и приложил к нему обработчик событий. Ни один из флажков для элементов в списке не будет делиться этим обработчиком, следовательно, код события никогда не вызывается.