XAML绑定问题,Parent-Child,有两个ListBox

时间:2015-09-30 05:55:44

标签: wpf xaml binding listbox

在XAML中非常新鲜,所以需要帮助。我很少失去绑定。因为我认为这是#34; Parent-Child"关系,我也做了短版本的代码。也许在某个地方帮助某人:)

问题:到目前为止,我在代码中只使用了一个ListBox,现在我需要两个listbox。

直到现在我这样绑定:

<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="True">

如何使用名称绑定选择?因为现在我有两个不同的ListBox。一个人有名字&#34; LstBox&#34;另一个&#34; SldBox&#34;。

我的简短代码:

<Grid>
<Grid.Resources>
    <DataTemplate>
        <Canvas>
            <Thumb>
                <Thumb.Template>
                    <ControlTemplate>
                        <Canvas>
                        </Canvas>
                        <ControlTemplate.Triggers>
                            <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="True">
                                    <Setter TargetName="Ellipse" Property="Fill" Value="Red"/>
                            </DataTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Thumb.Template>
            </Thumb>
        </Canvas>
    </DataTemplate>
</Grid.Resources>

<Grid>

    <ListBox x:Name=LstBox>
        <ListBox.Template>
            <ControlTemplate>
                <Border>
                    <Border.Background>
                    </Border.Background>
                    <ScrollViewer>
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </ListBox.Template>

        <ListBox.ItemsSource>
            <StaticResource ResourceKey="DiagramCol"/>
        </ListBox.ItemsSource>

        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas>
                </Canvas>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>

        <ListBox.ItemContainerStyle>
            <Style>
                <Setter>
                    <Setter.Value>
                        <ControlTemplate>
                            <ControlTemplate.Triggers>
                                <Triggers>
                                </Triggers>
                                <DataTrigger>
                                </DataTrigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListBox.ItemContainerStyle>
    <ListBox>

    <ListBox x:Name=SldBox>
        <ListBox.Template>
            <ControlTemplate>
                <Border>
                    <Border.Background>
                    </Border.Background>
                    <ScrollViewer>
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </ListBox.Template>

        <ListBox.ItemsSource>
            <StaticResource ResourceKey="DiagramCol"/>
        </ListBox.ItemsSource>

        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas>
                </Canvas>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>

        <ListBox.ItemContainerStyle>
            <Style>
                <Setter>
                    <Setter.Value>
                        <ControlTemplate>
                            <ControlTemplate.Triggers>
                                <Triggers>
                                </Triggers>
                                <DataTrigger>
                                </DataTrigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListBox.ItemContainerStyle>
    <ListBox>
</Grid>

我的长代码:

<Grid>
    <Grid.Resources>
        <BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter"/>

        <CompositeCollection x:Key="DiagramCol">
            <CollectionContainer Collection="{Binding DataContext.DiagramConnectors, Source={x:Reference diagramview}}"/>
            <CollectionContainer Collection="{Binding DataContext.DiagramNodes, Source={x:Reference diagramview}}"/>
        </CompositeCollection>

        <CompositeCollection x:Key="SliderCol">
            <CollectionContainer Collection="{Binding DataContext.SliderNodes, Source={x:Reference diagramview}}"/>
        </CompositeCollection>

        <!--NODES-->
        <DataTemplate DataType="{x:Type local:DiagramNode}">

            <Canvas Name="dragTarget">

                <Thumb DragDelta="Thumb_Drag" DragStarted="Thumb_DragStarted" DragCompleted="Thumb_DragCompleted">
                    <Thumb.Template>
                        <ControlTemplate TargetType="Thumb">
                            <Canvas Margin="-10,-10,10,10">
                                <Ellipse Height="17" Width="17" Stroke="Black" StrokeThickness="1" Fill="Yellow"
                                         x:Name="Ellipse"/>
                                <TextBlock Canvas.Top="-20" Canvas.Left="-40" Width="100" 
                                           TextAlignment="Center" Text="{Binding Name}" FontWeight="Bold"
                                           IsHitTestVisible="False"
                                           Visibility="{Binding DataContext.ShowNames, 
                                                                RelativeSource={RelativeSource FindAncestor, AncestorType=Window},
                                                                Converter={StaticResource BoolToVisibilityConverter}}"/>

                                <TextBlock Canvas.Left="30" Canvas.Top="10"
                                           Text="{Binding X, StringFormat='{}X = {0}'}"
                                           IsHitTestVisible="False"
                                           Visibility="Visible" x:Name="XText"/>

                                <TextBlock Canvas.Left="30" Canvas.Top="25"
                                           Text="{Binding Xmeaning}"
                                           IsHitTestVisible="False"
                                           Visibility="Visible" x:Name="timeText"/>

                                <TextBlock Canvas.Left="30" Canvas.Top="40"
                                           Text="{Binding Y, StringFormat='{}Y = {0}'}"
                                           IsHitTestVisible="False"
                                           Visibility="Visible" x:Name="YText"/>
                            </Canvas>

                            <ControlTemplate.Triggers>

                                <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="True">
                                    <Setter TargetName="Ellipse" Property="Fill" Value="Red"/>
                                </DataTrigger>
                                <Trigger Property="IsDragging" Value="True">
                                    <Setter TargetName="Ellipse" Property="Fill" Value="Green"/>
                                </Trigger>
                                <DataTrigger Binding="{Binding DataContext.ShowAllCoordinates, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" Value="True">
                                    <Setter TargetName="XText" Property="Visibility" Value="Visible"/>
                                    <Setter TargetName="YText" Property="Visibility" Value="Visible"/>
                                </DataTrigger>
                                <DataTrigger Binding="{Binding }" Value="True">
                                    <Setter TargetName="Ellipse" Property="StrokeThickness" Value="2"/>
                                    <Setter TargetName="Ellipse" Property="Stroke" Value="Red"/>
                                    <Setter TargetName="Ellipse" Property="Fill" Value="White"/>
                                </DataTrigger>
                                <MultiDataTrigger>
                                    <MultiDataTrigger.Conditions>
                                        <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="True"/>
                                        <Condition Binding="{Binding DataContext.ShowCurrentCoordinates, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" Value="True"/>
                                    </MultiDataTrigger.Conditions>
                                    <Setter TargetName="XText" Property="Visibility" Value="Visible"/>
                                    <Setter TargetName="YText" Property="Visibility" Value="Visible"/>
                                </MultiDataTrigger>

                            </ControlTemplate.Triggers>

                        </ControlTemplate>
                    </Thumb.Template>
                </Thumb>
            </Canvas>

        </DataTemplate>

        <!--Sliders-->
        <DataTemplate DataType="{x:Type local:SliderNode}">

            <Canvas Name="dragSlider">

                <Thumb DragDelta="Thumb_Drag" DragStarted="Thumb_DragStarted" DragCompleted="Thumb_DragCompleted">
                    <Thumb.Template>
                        <ControlTemplate TargetType="Thumb">
                            <Canvas Margin="-10,-10,10,10">
                                <Rectangle Height="22" Width="5" Stroke="Black" StrokeThickness="1" Fill="Yellow" x:Name="Rectangle"/>
                                <!--<Ellipse Height="17" Width="17" Stroke="Black" StrokeThickness="1" Fill="Yellow"
                                         x:Name="Ellipse"/>-->
                                <TextBlock Canvas.Top="-20" Canvas.Left="-40" Width="100" 
                                           TextAlignment="Center" Text="{Binding Name}" FontWeight="Bold"
                                           IsHitTestVisible="False"
                                           Visibility="{Binding DataContext.ShowNames, 
                                                                RelativeSource={RelativeSource FindAncestor, AncestorType=Window},
                                                                Converter={StaticResource BoolToVisibilityConverter}}"/>

                                <TextBlock Canvas.Left="30" Canvas.Top="10"
                                           Text="{Binding X, StringFormat='{}X = {0}'}"
                                           IsHitTestVisible="False"
                                           Visibility="Visible" x:Name="XText"/>

                                <TextBlock Canvas.Left="30" Canvas.Top="25"
                                           Text="{Binding Xmeaning}"
                                           IsHitTestVisible="False"
                                           Visibility="Visible" x:Name="timeText"/>

                                <TextBlock Canvas.Left="30" Canvas.Top="40"
                                           Text="{Binding Y, StringFormat='{}Y = {0}'}"
                                           IsHitTestVisible="False"
                                           Visibility="Visible" x:Name="YText"/>
                            </Canvas>

                            <ControlTemplate.Triggers>

                                <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="True">
                                    <Setter TargetName="Rectangle" Property="Fill" Value="Red"/>
                                </DataTrigger>
                                <Trigger Property="IsDragging" Value="True">
                                    <Setter TargetName="Rectangle" Property="Fill" Value="Green"/>
                                </Trigger>
                                <DataTrigger Binding="{Binding DataContext.ShowAllCoordinates, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" Value="True">
                                    <Setter TargetName="XText" Property="Visibility" Value="Visible"/>
                                    <Setter TargetName="YText" Property="Visibility" Value="Visible"/>
                                </DataTrigger>
                                    <DataTrigger Binding="{Binding }" Value="True">
                                        <Setter TargetName="Rectangle" Property="StrokeThickness" Value="2"/>
                                        <Setter TargetName="Rectangle" Property="Stroke" Value="Red"/>
                                        <Setter TargetName="Rectangle" Property="Fill" Value="White"/>
                                    </DataTrigger>
                                    <MultiDataTrigger>
                                    <MultiDataTrigger.Conditions>
                                        <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="True"/>
                                        <Condition Binding="{Binding DataContext.ShowCurrentCoordinates, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" Value="True"/>
                                    </MultiDataTrigger.Conditions>
                                    <Setter TargetName="XText" Property="Visibility" Value="Visible"/>
                                    <Setter TargetName="YText" Property="Visibility" Value="Visible"/>
                                </MultiDataTrigger>

                            </ControlTemplate.Triggers>

                        </ControlTemplate>
                    </Thumb.Template>
                </Thumb>
            </Canvas>

        </DataTemplate>


        <!--CONNECTORS-->
        <DataTemplate DataType="{x:Type local:DiagramConnector}">
            <Line Stroke="OrangeRed" StrokeThickness="3"
                  X1="{Binding Start.X}" Y1="{Binding Start.Y}"
                  X2="{Binding End.X}" Y2="{Binding End.Y}" x:Name="Line"/>

            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding Start}" Value="{x:Null}">
                    <Setter TargetName="Line" Property="Visibility" Value="Collapsed"/>
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </Grid.Resources>

    <Grid>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Name="column1" Width="*"/>
            <ColumnDefinition Width="auto"/>
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Name="row1" Height="*"/>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>



        <TextBlock Margin="2" x:Name="tbTitle" Grid.Column="1" Grid.Row="0" RenderTransformOrigin="0.5,0.5" FontSize="14" FontWeight="Bold" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" TextAlignment="Center" Text="{Binding GraphAddress}"/>
        <TextBlock Margin="2" x:Name="tbXlabel" Grid.Column="1" Grid.Row="3" RenderTransformOrigin="0.5,0.5" TextAlignment="Center" Text="{Binding Xlabellabel}" />
        <TextBlock Margin="2" x:Name="tbYlabelLeft" Grid.Column="0" Grid.Row="1" RenderTransformOrigin="0.5,0.5" TextAlignment="Center" Text="{Binding Ylabelleftlabel}">
            <TextBlock.LayoutTransform>
                <RotateTransform Angle="-90"/>
            </TextBlock.LayoutTransform>
        </TextBlock>

        <TextBlock Margin="2" x:Name="tbYlabelRight" Grid.Column="2" Grid.Row="1" RenderTransformOrigin="0.5,0.5" TextAlignment="Center" Text="{Binding Ylabelrightlabel}">
            <TextBlock.LayoutTransform>
                <RotateTransform Angle="-90"/>
            </TextBlock.LayoutTransform>
        </TextBlock>



        <ListBox SelectedItem="{Binding SelectedObject}"
                 PreviewMouseMove="ListBox_PreviewMouseMove"
                 PreviewMouseDown="ListBox_PreviewMouseDown"
                 PreviewMouseRightButtonDown="ListBox_PreviewMouseRightButtonDown"
                 PreviewMouseLeftButtonDown="ListBox_PreviewLeftMouseDown"
                 Margin="10,10,10,10"
                 Grid.Column="1"
                 Grid.Row="1"
                 x:Name="LstBox">
            <ListBox.Template>
                <ControlTemplate>
                    <Border>
                        <Border.Background>
                            <LinearGradientBrush StartPoint="0,0" EndPoint="1,1" Opacity=".3">
                                <GradientStop Color="Black" Offset="0"/>
                                <GradientStop Color="LightGray" Offset="1"/>
                            </LinearGradientBrush>
                        </Border.Background>

                        <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
                            <Border>
                                <Border.Background>
                                    <VisualBrush TileMode="Tile"
                                    Viewport="0,0,36,36" ViewportUnits="Absolute" 
                                    Viewbox="0,0,20,20" ViewboxUnits="Absolute">
                                        <VisualBrush.Visual>
                                            <Rectangle Stroke="Darkgray" StrokeThickness="0.5" Height="24" Width="24"
                                        StrokeDashArray="5 3"/>
                                        </VisualBrush.Visual>
                                    </VisualBrush>
                                </Border.Background>
                                <ItemsPresenter/>
                            </Border>
                        </ScrollViewer>

                    </Border>
                </ControlTemplate>
            </ListBox.Template>

            <ListBox.ItemsSource>
                <StaticResource ResourceKey="DiagramCol"/>
            </ListBox.ItemsSource>

            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas IsItemsHost="True" Background="#01FFFFFF"
                            Height="{Binding AreaHeight}" Width="{Binding AreaWidth}"
                            VerticalAlignment="Bottom" HorizontalAlignment="Left"/>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>

            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="Canvas.Left" Value="{Binding X}"/>
                    <Setter Property="Canvas.Top" Value="{Binding Y}"/>
                    <Setter Property="FocusVisualStyle" Value="{StaticResource EmptyFocusVisualStyle}"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="ListBoxItem">
                                <ContentPresenter x:Name="Content"/>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsSelected" Value="True">
                                        <Setter TargetName="Content" Property="Effect">
                                            <Setter.Value>
                                                <DropShadowEffect Color="Gray" ShadowDepth="4" BlurRadius="10"/>
                                            </Setter.Value>
                                        </Setter>
                                    </Trigger>
                                    <DataTrigger Binding="{Binding IsNew}" Value="True">
                                        <Setter Property="Opacity" Value=".5"/>
                                    </DataTrigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListBox.ItemContainerStyle>

        </ListBox>






        <ListBox SelectedItem="{Binding SelectedObject}"
                 PreviewMouseMove="ListBox_PreviewMouseMove"
                 PreviewMouseDown="ListBox_PreviewMouseDown"
                 PreviewMouseRightButtonDown="ListBox_PreviewMouseRightButtonDown"
                 PreviewMouseLeftButtonDown="ListBox_PreviewLeftMouseDown"
                 Margin="10,10,10,10"
                 Grid.Column="1"
                 Grid.Row="4"
                 x:Name="SldBox">
            <ListBox.Template>
                <ControlTemplate>
                    <Border>
                        <Border.Background>
                            <LinearGradientBrush StartPoint="0,0" EndPoint="1,1" Opacity=".3">
                                <GradientStop Color="Transparent" Offset="0"/>

                            </LinearGradientBrush>
                        </Border.Background>

                        <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
                            <Border>
                                <Border.Background>
                                    <VisualBrush TileMode="Tile"
                                    Viewport="0,0,0,11" ViewportUnits="Absolute" 
                                    Viewbox="0,0,20,20" ViewboxUnits="Absolute">
                                        <VisualBrush.Visual>
                                            <Rectangle Stroke="Darkgray" StrokeThickness="0.5" Height="24" Width="24"
                                        StrokeDashArray="5 3"/>
                                        </VisualBrush.Visual>
                                    </VisualBrush>
                                </Border.Background>
                                <ItemsPresenter/>
                            </Border>
                        </ScrollViewer>

                    </Border>
                </ControlTemplate>
            </ListBox.Template>

            <ListBox.ItemsSource>
                <StaticResource ResourceKey="SliderCol"/>
            </ListBox.ItemsSource>

            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas IsItemsHost="True" Background="#01FFFFFF"
                            Height="50" Width="{Binding AreaWidth}"
                            VerticalAlignment="Bottom" HorizontalAlignment="Left"/>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>

            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="Canvas.Left" Value="{Binding X}"/>
                    <Setter Property="Canvas.Top" Value="10"/>
                    <Setter Property="FocusVisualStyle" Value="{StaticResource EmptyFocusVisualStyle}"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="ListBoxItem">
                                <ContentPresenter x:Name="Content"/>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsSelected" Value="True">
                                        <Setter TargetName="Content" Property="Effect">
                                            <Setter.Value>
                                                <DropShadowEffect Color="Gray" ShadowDepth="4" BlurRadius="10"/>
                                            </Setter.Value>
                                        </Setter>
                                    </Trigger>
                                    <DataTrigger Binding="{Binding IsNew}" Value="True">
                                        <Setter Property="Opacity" Value=".5"/>
                                    </DataTrigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListBox.ItemContainerStyle>

        </ListBox>
    </Grid>
</Grid>

请求帮助。如有任何疑问或误解,请询问:)

1 个答案:

答案 0 :(得分:1)

你可以尝试

"{Binding ElementName=LstBox, Path=ItemsSource.Count, Converter={StaticResource ItemsSourceCountConverter}}"

然后,将ElementName更改为另一个名为SldBox的ListBox。我提供了一条路,你很可能需要另一个房产。要按照您的示例,您将添加IsSelected。

当然你可以摆脱那个转换器,我只是作为一个例子添加它。