Возвращение контроля событий обратно в xaml / callee для проверки доступа / снятия галочки - PullRequest
0 голосов
/ 03 мая 2010

Я искал в Интернете, но мой поисковый запрос не должен работать, если он там есть, потому что я просто не могу найти правильные условия поиска, чтобы получить ответ, который я ищу. Поэтому я обращаюсь к экспертам в качестве последнего средства, чтобы указать мне правильное направление.

То, что я пытаюсь сделать, это создать комбинированный элемент управления для текстового поля и списка, но я хочу позволить потребителю элемента управления решать, что делать, когда флажок установлен / снят, а я просто не могу понять это ... Может быть, я все делаю не так.

То, что я до сих пор делал, это:

  1. создать пользовательский элемент управления, расширяющий ListBox
  2. выставить пользовательский DP с именем «Текст» (для текстового поля, но это не важная часть)
  3. создайте файл generic.xaml, чтобы элементы списка имели элемент по умолчанию ItemTemplate / DataTemplate.
    1. внутри DataTemplate Я пытаюсь установить события "Проверено" или "Не проверено"
  4. представляет события «обертки» как DP в пользовательском элементе управления, которые будут «установлены» через шаблон при установке

Как только я попробую что-то вроде следующего (внутри generic.xaml):

<DataTemplate>
    <...>
    <CheckBox Checked="{TemplateBinding MyCheckedDP}"/>
    <...>
</DataTemplate>

Я получаю исключения во время выполнения, дизайнер - vs2010 - вытаскивает длинный список ошибок, которые очень похожи, и ничто из того, что я делаю, не может заставить его работать.

Я зашел так далеко, что попытался использовать VisualTreeHelper, но ни одна волшебная комбинация, которую я смог найти, не сработала бы и не позволила бы мне пройти по дереву, потому что когда метод OnApplyTemplate запускает элементы списка, они еще не существуют и не в дереве.

Так что, надеюсь, все это имеет смысл, но если нет, пожалуйста, дайте мне знать, и я отредактирую пост для разъяснений.

Спасибо всем за любые указания или мысли ... Как я уже сказал, может быть, я с самого начала об этом говорю не так ...

РЕДАКТИРОВАТЬ (Запрос на xaml)

шаблонная таблица generic.xaml:

<DataTemplate >
    <StackPanel Orientation="Horizontal" >
        <local:FilterCheckbox x:Name="chk">
            <TextBlock Text="{Binding Path=Display}" />
        </local:FilterCheckbox>
    </StackPanel>
</DataTemplate>

usercontrol.xaml (вызов пользовательского элемента управления)

<local:MyControl FancyName="This is the fancy name"
    ItemChecked="DoThisWhenACheckboxIsChecked" <-- this is where the consumer "ties" to the checkbox events
    ItemsSource="{Binding Source={StaticResource someDataSource}}" 
/>

Ответы [ 2 ]

0 голосов
/ 12 мая 2010

Ну, мне не нравится отвечать на мой собственный вопрос, но ответ выше не работает для меня, и ссылка, на которую ссылаются, не делает то, что я ищу.

Я публикую этот единственный ответ, чтобы я мог поддерживать 100% ответ ...

0 голосов
/ 06 мая 2010

Предполагая, что вы хотите запустить событие из вашего пользовательского элемента управления, нажимая на флажок и обрабатывая его в своем классе реализации, следующее должно работать.

Прежде всего, попробуйте удалить привязку шаблона к событию, хотя мы ожидаем, что он может работать, как работает templateBinding DependencyProperty

Итак, ваш XAML будет выглядеть примерно так:

<DataTemplate> 
    <...> 
    <CheckBox x:Name="myCheckBox" /> 
    <...> 
</DataTemplate>

Теперь вы должны получить доступ к вашему checkBox из generic.cs, как показано ниже:

 public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
           CheckBox myCheckBox= GetTemplateChild("myCheckBox") as CheckBox;
         }

Теперь вам просто нужно добавить событие в ваш элемент управления.

public event EventHandler checkBoxChecked;

Теперь это обычно реализуется так: -

 protected virtual void onCheckBoxChecked(EventArgs e) 
    { 
         var handler = checkBoxChecked;
        if (handler != null) 
             handler(this, e);    
     }

Теперь в ваших существующих проверенных событиях: -

myCheckBox.Checked+= (obj, Args) => 
{
    onCheckBoxChecked(EventArgs.Empty); 
}

Теперь в своем потребляющем коде или реализующем приложении вы можете делать такие вещи (при условии, что ваше имя CustomControl Name - myCustomControl):

myCustomControl.checkBoxChecked+=(s, args) => { /* Your Code Here*/ }; 

Надеюсь, это то, что вы пытались придумать. Если что-нибудь понадобится, давай обсудим здесь.

Обновление

Ну, есть подробное обсуждение onApplyTemplate, загрузки элементов управления и доступа к событиям вне этого класса:

Посмотрите:

Как получить доступ к кнопке, представленной внутри пользовательского элемента управления, со страницы реализации?

...