【问题标题】:Click event on an item template项目模板上的单击事件
【发布时间】:2016-10-05 18:35:56
【问题描述】:

我的列表框项目有这个 wpf 代码:

 <ListBox x:Name="icTodoList" ItemsSource="{Binding ListControleMachine}" Grid.Column="3">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Border BorderBrush="{Binding borderColor}" BorderThickness="2" Margin="0,0,0,1">
                <Grid Margin="1">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="30"/>
                        <ColumnDefinition Width="20"/>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition Width="120"/>
                        <ColumnDefinition Width="130"/>
                        <ColumnDefinition Width="120"/>
                        <ColumnDefinition Width="120"/>
                        <ColumnDefinition Width="120"/>
                        <ColumnDefinition Width="120"/>
                    </Grid.ColumnDefinitions>
                    <CheckBox x:Name="check_action" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" IsChecked="{Binding ActionCheked,Mode=TwoWay}"/>
                    <Ellipse x:Name="E_Ping" HorizontalAlignment="Left" Fill="{Binding PingDotColor}" Height="10" Width="10" Margin="2,4,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.2,-1.182" Grid.Column="1"/>
                    <TextBlock Text="{Binding titlePing}" Grid.Column="2" MouseDown="TextBlock_MouseDown" Tag="{Binding ComputerName}"/>
                    <TextBlock Text="{Binding titlePing}" Grid.Column="2" MouseDown="TextBlock_MouseDown" Tag="{Binding ComputerName}"/>
                    <TextBlock Text="{Binding titleDcai}" Grid.Column="3" MouseDown="TextBlock_MouseDown" Tag="{Binding ComputerName}"/>
                    <TextBlock Text="{Binding titleAd}" Grid.Column="4" MouseDown="TextBlock_MouseDown" Tag="{Binding ComputerName}"/>
                    <TextBlock Text="{Binding FPACtitle}" Grid.Column="5" MouseDown="TextBlock_MouseDown" Tag="{Binding ComputerName}"/>
                    <TextBlock Text="{Binding titleMcAfee}" Grid.Column="6" MouseDown="TextBlock_MouseDown" Tag="{Binding ComputerName}"/>
                    <TextBlock Text="{Binding gkUser}" Grid.Column="7" MouseDown="TextBlock_MouseDown" Tag="{Binding ComputerName}"/>
                    <TextBlock Text="{Binding titleservicestat}" Grid.Column="8" MouseDown="TextBlock_MouseDown" Tag="{Binding ComputerName}"/>
                 </Grid>
            </Border>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

如您所见,我在每个文本框上都有一个“TextBlock_MouseDown”

然后是c#代码。

private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
     TextBlock t = sender as TextBlock;
     DetailedView.DataContext = ListControleMachine.Where(x => x.ComputerName == t.Tag.ToString());
     DetailedView.Visibility = System.Windows.Visibility.Visible;  
}

好的,所以它基本上可以满足我的需要,它会弹出一个视图,其中重新绑定了数据。

但我很确定这不是一种干净的方法。

首先我不会在每个文本块上发生事件,而是在它自己的 listboxitem 上发生事件(但我不知道如何以这种方式传递计算机名参数)。

第二个可能是我唯一的问题我认为我不必搜索我的收藏并用这个重新绑定我的新视图:

DetailedView.DataContext =  ListControleMachine.Where(x => x.ComputerName == t.Tag.ToString());

为了清楚如何单击项目模板并弹出一个包含实际列表框项目绑定数据的视图?

【问题讨论】:

    标签: c# wpf binding listbox


    【解决方案1】:

    尝试通过绑定到 ListBox 的 SelectedItem 来设置 DataContext

    <DetailedView DataContext="{Binding Path=SelectedItem, ElementName=icTodoList, Mode=OneWay}"/>
    

    或等效代码

    var binding = new Binding
    {
        Path = new PropertyPath("SelectedItem"),
        ElementName = "icTodoList", 
        Mode = BindingMode.OneWay
    };
    BindingOperations.SetBinding(DetailedView, Control.DataContextProperty, binding);
    


    另一种方法

    ListBox 有SelectionChanged 事件

    <ListBox Name="icTodoList" 
                SelectionChanged="IcTodoList_OnSelectionChanged">
    
    </ListBox>
    

    事件处理程序

    private void IcTodoList_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        DetailedView.DataContext = icTodoList.SelectedItem;
        DetailedView.Visibility = System.Windows.Visibility.Visible;  
    }
    

    Tag 值和TextBlock_MouseDown 处理程序将不是必需的

    【讨论】:

    • duno 将这一行的详细视图放在哪里是详细用户控件的一个实例: Genkai_wpf.Views.mini_controle.detailDetailedView= new Genkai_wpf.Views.mini_controle.detail();
    • @Zwan,该行应该是 xaml。但我还添加了一个带有代码的变体。查看我的编辑
    • 很好地使用 selecteditem 是一个想法,但不能让它以这种方式工作;( .
    • @Zwan,另一个想法:ListBox 有 SelectionChanged 事件。尝试使用它而不是 TextBlock_MouseDown
    • DetailedView.DataContext = icTodoList.SelectedItem;这对我有用,从来没有艰难的选定项等于数据上下文令人困惑..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 2010-12-16
    相关资源
    最近更新 更多