从ControlTemplate获取模板元素内容或文本

时间:2014-08-07 00:43:27

标签: c# xaml mobile windows-phone-8

我正在使用Windows Phone 8 C#和SQLite应用程序。我是Windows Phone应用程序的新手,通常使用PHP和JS。

有一个LongListSelector,每个项目都是一个Button。每个Button都应该引用一个从一类SQLite中绑定的ID:

<phone:LongListSelector x:Name="llsRadios" ItemsSource="{Binding Radios}" ItemTemplate="{StaticResource DataTemplate1}"/>

DataTemplate1:​​

<DataTemplate x:Key="DataTemplate1">
    <Grid>
        <Button x:Name="btnFoo" Template="{StaticResource ButtonControlTemplate1}" Click="btnFoo_Click" />
        <toolkit:ContextMenuService.ContextMenu>
            <toolkit:ContextMenu IsZoomEnabled="True" x:Name="ContextMenu" >
                <toolkit:MenuItem x:Name="btnEditFoo" Header="edit" Click="btnEditFoo_Click"/>
                <toolkit:MenuItem x:Name="btnDeleteFoo" Header="delete" Click="btnDeleteFoo_Click"/>
            </toolkit:ContextMenu>
        </toolkit:ContextMenuService.ContextMenu>
    </Grid>
</DataTemplate>

ButtonControlTemplate1:​​

<ControlTemplate x:Key="ButtonControlTemplate1" TargetType="Button">
    <Grid>
       <TextBlock x:Name="lblName" Text="Name" />
       <TextBlock x:Name="lblCountry" Text="Country" />
    </Grid>
</ControlTemplate>

当用户点击其中一个按钮时,我需要在事件Click上获取此ID值,该值代表SQLite上的一行,然后运行select * from table where ID = ...,例如。

在JavaScript中,我会添加一个属性data-id并处理如下事件:

this.getAttribute('data-id');
// run an AJAX request

我的第一个想法是将每个按钮的Content绑定到ID,这样我就可以在btnFoo_click上运行:

Button btn = sender as Button;
var ID = sender.Content;
// Do SQLite select.

但这似乎不是正确的做法。另外,我必须在ConceptMenus上使用相同的概念(暂停,两个选项:Edit和Delete将显示。这些必须对用户选择的元素执行操作。)

另外我认为我可以访问按钮的模板并找到一个隐藏元素,它具有将值绑定到其TextContent属性的相同想法。但是我找不到从模板中选择元素的方法,有点像jQuery的查找:$('.parent').find('.element-i-need');

坚持第二个想法,我如何在点击的按钮/元素的ControlTemplate上按名称搜索元素?

1 个答案:

答案 0 :(得分:0)

首先,您是否知道可以通过DataContext获取模型?这是在点击处理程序中执行此操作的最直接方式:

Button btn = sender as Button;
var viewmodel = btn.DataContext as MyItemModel;
var ID = viewmodel.ID;
// Do SQLite select.

对于第二个,您无法直接从控件外部访问模板元素(有GetTemplateChild,但这是受保护的方法)。粗略等同于JQuery&#34;发现&#34;将追踪visual tree,但在XAML中这是非常糟糕的形式,并不总是有效(并非所有内容都在可视化树中,例如Popups)。但是,您可以继承Button控件,并公开使用GetTemplateChild的公共属性。

理想情况下,您的模型逻辑根本不应与UI进行交互。在可能的情况下,最好使用<Button Command="{Binding SomeCommand}" ... />其中&#34; SomeCommand&#34;是ICommand实施,而不是<Button Click="CodeHandler" ... />。然而,这说起来容易做起来难,尤其是在没有FindAncestor绑定的WP Silverlight中......