RadDataBoundListBox 中上下文菜单的 FocusedElement 始终为空
FocusedElement of context menu in RadDataBoundListBox is always getting null
我在 mvvmcross WP 应用程序中使用 RadDataBoundListBox。我将 Pivot 用于选项卡,之前我为所有数据透视项创建了一个视图模型,但现在为所有数据透视项创建了子视图模型。由于我使用 DataContext 属性 进行子视图模型绑定,但 RadContextMenu 出现问题。当上下文菜单的 "Opening" 事件触发时,FocusedElement 变为 null 并且没有命令工作。
tappedItem 在此行中始终为 null。
RadDataBoundListBoxItem tappedItem = e.FocusedElement as Telerik.Windows.Controls.RadDataBoundListBoxItem;
这是我的代码:
- test.xaml 文件:
<phone:Pivot x:Name="uiPivot" Title="{Binding HeaderTitle}">
<!-- Tab 1 -->
<phone:PivotItem x:Name="uiPivotTicketDetails" Header="ticket details" DataContext="{Binding TicketEditVM}">
<!-- Some Code -->
</phone:PivotItem>
<!-- Tab 2-->
<phone:PivotItem x:Name="uiPivotTimeEntry" DataContext="{Binding TicketTimeEntryVM}" >
<phone:PivotItem.Header>
<StackPanel Orientation="Horizontal">
<telerik:RadImageButton HorizontalAlignment="Center" Margin="0, 20, 0, 0" VerticalAlignment="Center" Command="{Binding CmdTimeEntryAdd}" ButtonShape="Ellipse" RestStateImageSource="/Assets/Images/Add-New.png"/>
<TextBlock Text="time entries" />
</StackPanel>
</phone:PivotItem.Header>
<telerik:RadDataBoundListBox x:Name="uiTimeEntryList" ItemsSource="{Binding TicketTimeEntries}" ItemTemplate="{StaticResource TimeEntryItemTemplate}" EmptyContent="There are no time entries to display">
<telerikPrimitives:RadContextMenu.ContextMenu>
<telerikPrimitives:RadContextMenu OpenGesture="Hold" Opening="uiTicketTimeEntryMenu_Opening" >
<telerikPrimitives:RadContextMenuItem Content="edit" Tap="onTicketTimeEntryEdit_Tap" />
<telerikPrimitives:RadContextMenuItem Content="delete" Tap="onTicketTimeEntryDelete_Tap" />
</telerikPrimitives:RadContextMenu>
</telerikPrimitives:RadContextMenu.ContextMenu>
</telerik:RadDataBoundListBox>
</phone:PivotItem>
这是Test.xaml.cs:
public partial class TicketEditHomeView : MvxPhonePage
{
public TicketEditHomeView()
{
InitializeComponent();
// Set the Context menu...
RadContextMenu.SetFocusedElementType(this.uiTimeEntryList, typeof(RadDataBoundListBox));
}
private void uiTicketTimeEntryMenu_Opening(object sender, Telerik.Windows.Controls.ContextMenuOpeningEventArgs e)
{
try
{
// This tktTappedItem is getting null
RadDataBoundListBoxItem tktTappedItem = e.FocusedElement as Telerik.Windows.Controls.RadDataBoundListBoxItem;
if (tktTappedItem != null)
{
ticketTimeEntryDataContext = tktTappedItem.DataContext;
}
if (tktTappedItem == null)
{
e.Cancel = true;
}
}
catch { }
finally
{
if (tktTappedItem != null)
{
tktTappedItem = null;
}
}
}
private void onTicketTimeEntryEdit_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
this.ViewModel.TicketTimeEntryVM.CmdTimeEntrySelected.Execute(ticketTimeEntryDataContext);
}
private void onTicketTimeEntryDelete_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
this.ViewModel.TicketTimeEntryVM.CmdTimeEntryDeleted.Execute(ticketTimeEntryDataContext);
}
}
-我知道我错在哪里了。在构造函数中设置焦点元素类型时,我使用的是 RadDataBoundListBox 而不是 RadDataBoundListBoxItem。
这是正确的代码:
public TicketEditHomeView()
{
InitializeComponent();
// Set the Context menu...
RadContextMenu.SetFocusedElementType(this.uiTimeEntryList, typeof(RadDataBoundListBoxItem));
}
我在 mvvmcross WP 应用程序中使用 RadDataBoundListBox。我将 Pivot 用于选项卡,之前我为所有数据透视项创建了一个视图模型,但现在为所有数据透视项创建了子视图模型。由于我使用 DataContext 属性 进行子视图模型绑定,但 RadContextMenu 出现问题。当上下文菜单的 "Opening" 事件触发时,FocusedElement 变为 null 并且没有命令工作。
tappedItem 在此行中始终为 null。
RadDataBoundListBoxItem tappedItem = e.FocusedElement as Telerik.Windows.Controls.RadDataBoundListBoxItem;
这是我的代码:
- test.xaml 文件:
<phone:Pivot x:Name="uiPivot" Title="{Binding HeaderTitle}">
<!-- Tab 1 -->
<phone:PivotItem x:Name="uiPivotTicketDetails" Header="ticket details" DataContext="{Binding TicketEditVM}">
<!-- Some Code -->
</phone:PivotItem>
<!-- Tab 2-->
<phone:PivotItem x:Name="uiPivotTimeEntry" DataContext="{Binding TicketTimeEntryVM}" >
<phone:PivotItem.Header>
<StackPanel Orientation="Horizontal">
<telerik:RadImageButton HorizontalAlignment="Center" Margin="0, 20, 0, 0" VerticalAlignment="Center" Command="{Binding CmdTimeEntryAdd}" ButtonShape="Ellipse" RestStateImageSource="/Assets/Images/Add-New.png"/>
<TextBlock Text="time entries" />
</StackPanel>
</phone:PivotItem.Header>
<telerik:RadDataBoundListBox x:Name="uiTimeEntryList" ItemsSource="{Binding TicketTimeEntries}" ItemTemplate="{StaticResource TimeEntryItemTemplate}" EmptyContent="There are no time entries to display">
<telerikPrimitives:RadContextMenu.ContextMenu>
<telerikPrimitives:RadContextMenu OpenGesture="Hold" Opening="uiTicketTimeEntryMenu_Opening" >
<telerikPrimitives:RadContextMenuItem Content="edit" Tap="onTicketTimeEntryEdit_Tap" />
<telerikPrimitives:RadContextMenuItem Content="delete" Tap="onTicketTimeEntryDelete_Tap" />
</telerikPrimitives:RadContextMenu>
</telerikPrimitives:RadContextMenu.ContextMenu>
</telerik:RadDataBoundListBox>
</phone:PivotItem>
这是Test.xaml.cs:
public partial class TicketEditHomeView : MvxPhonePage
{
public TicketEditHomeView()
{
InitializeComponent();
// Set the Context menu...
RadContextMenu.SetFocusedElementType(this.uiTimeEntryList, typeof(RadDataBoundListBox));
}
private void uiTicketTimeEntryMenu_Opening(object sender, Telerik.Windows.Controls.ContextMenuOpeningEventArgs e)
{
try
{
// This tktTappedItem is getting null
RadDataBoundListBoxItem tktTappedItem = e.FocusedElement as Telerik.Windows.Controls.RadDataBoundListBoxItem;
if (tktTappedItem != null)
{
ticketTimeEntryDataContext = tktTappedItem.DataContext;
}
if (tktTappedItem == null)
{
e.Cancel = true;
}
}
catch { }
finally
{
if (tktTappedItem != null)
{
tktTappedItem = null;
}
}
}
private void onTicketTimeEntryEdit_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
this.ViewModel.TicketTimeEntryVM.CmdTimeEntrySelected.Execute(ticketTimeEntryDataContext);
}
private void onTicketTimeEntryDelete_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
this.ViewModel.TicketTimeEntryVM.CmdTimeEntryDeleted.Execute(ticketTimeEntryDataContext);
}
}
-我知道我错在哪里了。在构造函数中设置焦点元素类型时,我使用的是 RadDataBoundListBox 而不是 RadDataBoundListBoxItem。
这是正确的代码:
public TicketEditHomeView()
{
InitializeComponent();
// Set the Context menu...
RadContextMenu.SetFocusedElementType(this.uiTimeEntryList, typeof(RadDataBoundListBoxItem));
}