将事件控制返回给xaml / callee以访问check / uncheck

时间:2010-05-03 12:19:33

标签: silverlight custom-controls

我已经在互联网上搜索了但是如果它在那里我的搜索foo一定不能工作因为我找不到合适的搜索条件来得到我正在寻找的答案。所以我转向专家,作为最后的手段指出我正确的方向。

我要做的是创建一个文本框和列表框的复合控件但是我想让控件使用者决定在选中/取消选中复选框时该怎么做而我不能搞清楚......也许我错了。

到目前为止我所做的是:

  1. 创建扩展ListBox的自定义控件
  2. 公开名为“Text”的自定义DP(对于“文本”框,但它不是重要部分)
  3. 制作generic.xaml,以便列表项具有默认的ItemTemplate / DataTemplate
    1. 在DataTemplate中我试图设置“已检查”或“未检查”事件
  4. 在自定义控件中将“包装”事件公开为DP,以便在实例化时通过模板“设置”
  5. 只要我尝试以下内容(在generic.xaml中):

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

    我得到运行时异常,设计师 - vs2010 - 列出了一个非常相似的错误列表,我所做的任何事情都无法使其发挥作用。

    我竟然尝试使用VisualTreeHelper,但没有我能找到的魔法组合也不会让我遍历树,因为当OnApplyTemplate方法触发列表框时,项目尚不存在且不是< em>在树中。

    所以希望这一切都有意义,但如果不是,请告诉我,我会编辑帖子进行澄清。

    感谢大家的任何指示或想法......就像我说的那样,从一开始我就可能以错误的方式前进......

    编辑(申请xaml)

    generic.xaml datatemplate:

    <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 :(得分:0)

假设您要从自定义控件中触发事件,同时单击checkBox并在实现类中处理它, 以下应该有效。

首先尝试删除带有事件的模板绑定,尽管我们期望它可以正常工作,因为它可以工作templateBinding DependencyProperty

所以你的XAML看起来如下:

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

现在您必须从generic.cs访问您的checkBox,如下所示:

 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名称是myCustomControl): -

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

希望这是你想要成就的东西。如果需要任何东西,请在这里讨论。

<强>更新

有关onApplyTemplate和加载控件以及访问该类之外的事件的详细讨论:

看看:

How to Access a Button present inside a Custom Control, from the implementing page?

答案 1 :(得分:0)

好吧,我不喜欢回答我自己的问题,但上面的答案对我不起作用,引用的链接也不是我正在寻找的。

我发布这个唯一的答案,以便我能保持100%的回答率......