如何使用ItemsControl获取SelectedItem并显示Headers?

时间:2012-06-08 08:10:57

标签: wpf wpf-controls itemscontrol

我正在研究WPF Windows应用程序。我正在使用ItemsControl来显示集合列表。通过这个工作,我发现ItemsControl中没有SelectedItem属性。然后我如何从ItemsControl中获取Selected Item。还有如何显示ItemsControl的标题。

<ItemsControl ItemsSource="{Binding CustomSalesProducts, Mode=TwoWay}">
        <ItemsControl.Template>
            <ControlTemplate TargetType="ItemsControl">
                <Border>
                    <ScrollViewer VerticalScrollBarVisibility="Auto">
                        <ItemsPresenter/>
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </ItemsControl.Template>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel CanHorizontallyScroll="True" CanVerticallyScroll="True" Orientation="Vertical"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid x:Name="SalesGrid" Background="White">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>
                    <controls:HeaderedContentControl Header="{Binding ProductName, Mode=TwoWay}" Margin="{DynamicResource Margin4}" Style="{DynamicResource HeaderedContentControlStyle}" HorizontalContentAlignment="Right">
                    </controls:HeaderedContentControl>
                    <TextBox Text="{Binding OrderQty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" Margin="{StaticResource Margin4}" Style="{DynamicResource MiniTextBoxStyle}" ToolTip="Quantity" />
                    <TextBlock Text="{Binding UnitSalePrice, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" Grid.Row="1" Margin="{StaticResource Margin4}" ToolTip="Price"/>
                    <TextBox Text="{Binding Discount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="2" Grid.Row="1" Margin="{StaticResource Margin4}" Style="{DynamicResource MiniTextBoxStyle}" ToolTip="Discount"/>
                    <TextBlock Text="{Binding TaxAmount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="3" Grid.Row="1" Margin="{StaticResource Margin4}" ToolTip="Tax Amount"/>
                    <TextBlock Text="{Binding LineTotal, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="4" Grid.Row="1" Margin="{StaticResource Margin4}" ToolTip="Total"/>

                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

谢谢,

3 个答案:

答案 0 :(得分:1)

正如您所说,SelectedItem中没有ItemsControl。您可以改为使用ListBox

答案 1 :(得分:0)

我发现使用标头有HeaderdItemsControl。有了这个,我可以添加标题,也不可重复。但问题是我们必须为头部及其项目定义静态大小,如果我们定义自动大小,那么headeredItemsControl的UI并不完美,所以我们必须给出它的静态大小。

您可以阅读this了解如何使用HeaderedItemsControl?

答案 2 :(得分:0)

派对有点晚了,但我遇到了同样的问题,希望这可以帮助其他人,因为我没有想要使用列表框。

您可以将SelectedCustomSalesProduct属性公开给您用作DataContext的类,然后您可以通过在选择项目时设置它来自己跟踪所选项目。

在SalesGrid中,您可以为MouseLeftButtonDown和TouchDown事件添加事件处理程序,并使用Tag属性来保持对正在呈现的项目的引用:

请注意,在我的情况下,我使用的是StackPanel而不是Grid,我没有编译下面的代码,将其用于说明目的。

通过使用此示例,您应该能够获得一般的想法并在业务服务中设置Selected项。

<DataTemplate>
    <Grid x:Name="SalesGrid" Background="White"
          Tag="{Binding}" 
          TouchDown="DataTemplate_Touch"
          MouseLeftButtonDown="DataTemplate_Click">

然后在您的UserControl /窗口代码中,您可以跟踪所选项目:

/// <summary>
/// MyScreen.xaml
/// </summary>
public partial class MyScreen : UserControl
{
    private MyServiceWrapper _serviceWrapper;

    public MyScreen()
    {
        InitializeComponent();
    }
    public MyScreen(MyServiceWrapper serviceWrapper)
    {
        //Instrumentation.Log(typeof(MyScreen), LogTypes.Trace, "Creating instance of MyScreen");

        this._serviceWrapper = serviceWrapper;

        // Set your DataContext, is this the class that would also have your 
        // CustomSalesProducts property exposed 
        this.DataContext = this._serviceWrapper;
        InitializeComponent();
    }



    private void DataTemplate_Touch(object sender, System.Windows.Input.TouchEventArgs e)
    {
        SetSelectedCustomSalesProduct(sender);
    }

    private void DataTemplate_Click(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        SetSelectedCustomSalesProduct(sender);
    }

    private void SetSelectedCustomSalesProduct(object sender)
    {
        _serviceWrapper.SelectedCustomSalesProduct = ((Grid)sender).Tag as CustomSalesProduct;

    }



}