带有超链接的ListBox - >选择改变了

时间:2011-09-29 15:50:46

标签: silverlight hyperlink selecteditem

我想用xaml绑定这样的功能:

列表框包含超链接。

点击超链接后,我们转到另一个框架

但也必须更改SelectedItem,在另一帧上我们会显示有关所选项目的信息。

我想要它而不订阅点击/选定的事件。只有声明

我的列表框示例

 <ListBox Grid.Row="1" 
        x:Name="OrderTypesListBox"          
        ItemsSource="{Binding OrderTypes, Mode=OneWay}"
        SelectedItem="{Binding SelectedCall.OrderType, Mode=TwoWay}"            
    >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                <TextBlock Text="{Binding Name}" />
                    <HyperlinkButton Style="{StaticResource LinkStyle}" NavigateUri="/WindowPage" TargetName="ContentFrame" Content="WindowPage"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>      

现在像那样解决

<ListBox Grid.Row="1" 
        x:Name="OrderTypesListBox"          
        ItemsSource="{Binding OrderTypes, Mode=OneWay}"
        SelectedItem="{Binding SelectedCall.OrderType, Mode=TwoWay}"            
    >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <HyperlinkButton                            
                    TargetName="ContentFrame" 
                    NavigateUri="{Binding OrderTypeNextPage}"                           
                    Content="{Binding Name}"
                    Click="HyperlinkButton_Click"
                    Tag="{Binding}"
                />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

private void HyperlinkButton_Click(object sender, RoutedEventArgs e)
    {
        OrderTypesListBox.SelectedItem = (sender as HyperlinkButton).Tag;
    }

1 个答案:

答案 0 :(得分:0)

不要使用HyperlinkBut​​ton。在ViewModel中SelectedItem发生更改时执行所需的操作。

编辑:如果您需要响应所有点击事件,即使该项已被选中,您也可以使用行为执行此操作。只需为TextBlock单击事件导航的TextBlock创建一个行为。

Edit2:行为非常简单,易于编码且易于使用(并且不会破坏MVVM范例)。

public class NavigatingTextBlockBehavior : Behavior<TextBlock>
{
  protected override void OnAttached()
  {
    AssociatedObject.MouseLeftButtonDown += new MouseButtonEventHandler(OnMouseDown);
  }

  private void OnMouseDown(object sender, MouseButtonEventArgs e)
  {
      NavigationService.Navigate(new Uri("/WindowPage"));
  }
}