【问题标题】:ListBox with hyperlink -> selection changed带有超链接的列表框 -> 选择已更改
【发布时间】:2011-09-29 15:50:46
【问题描述】:

我想用 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;
    }

【问题讨论】:

    标签: silverlight hyperlink selecteditem


    【解决方案1】:

    不要使用超链接按钮。当您的 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"));
      }
    }
    

    【讨论】:

    • 如果项目已经被选中 - 如果不点击我无法做到这一点 += - 当用户点击已经选择的项目时选择不会改变。
    • 你可以使用一个行为来做到这一点。
    • 一些行为示例会很有帮助。
    • 对我没用...太多代码 - 我在主页上有框架并将框架导航到该页面 - NavigationService 不适合我。我还将通过绑定不同的项目来生成链接。我认为在 hyperlink.click+= 上更改 selecteditem 会比行为简单
    • 代码太多?听起来您正在寻找一个不存在的解决方案。如果您需要有关框架的帮助,则必须发布一些有关它的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    相关资源
    最近更新 更多