【问题标题】:Getting a template element content or text from ControlTemplate从 ControlTemplate 获取模板元素内容或文本
【发布时间】:2014-08-07 00:43:27
【问题描述】:

我正在开发一个 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}"/>

数据模板1:

<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 上获取表示 SQLite 上一行的 ID 值,然后运行 ​​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 上使用相同的概念(暂停时,将显示两个选项:编辑和删除。这些必须对用户选择的元素执行操作。)

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    对于第二个,您不能直接从控件外部访问模板元素(有GetTemplateChild,但这是一种受保护的方法)。 JQuery“查找”的粗略等同于追踪visual tree,但这在XAML 中是非常糟糕的形式,并且并不总是有效(并非所有内容都在可视化树中,例如弹出窗口)。但是,您可以继承 Button 控件,并公开一个使用 GetTemplateChild 的公共属性。

    不过,理想情况下,您的模型逻辑根本不应该与 UI 交互。如果可能,最好使用&lt;Button Command="{Binding SomeCommand}" ... /&gt;,其中“SomeCommand”是ICommand 实现,而不是&lt;Button Click="CodeHandler" ... /&gt;。不过,说起来容易做起来难,尤其是在没有 FindAncestor 绑定的 WP Silverlight 中...

    【讨论】:

    • 我很确定DataContext 是我完全抛在脑后的东西,因为它似乎有点难以理解,但实际上正是我所需要的。由于 LongListSelector 是由Radio 绑定的,所以它的子项也已经设置了这个属性,对吧?对于 jQuery 的 find 方法,我期待它不会很容易甚至是不可能的。我认为坚持使用 DataContext 并理解它会对我有很大帮助。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2011-02-14
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多