我正在使用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将显示。这些必须对用户选择的元素执行操作。)
另外我认为我可以访问按钮的模板并找到一个隐藏元素,它具有将值绑定到其Text
或Content
属性的相同想法。但是我找不到从模板中选择元素的方法,有点像jQuery的查找:$('.parent').find('.element-i-need');
坚持第二个想法,我如何在点击的按钮/元素的ControlTemplate
上按名称搜索元素?
答案 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中......