1

我正在开发 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>

谢谢,

4

3 回答 3

1

正如你所说SelectedItem,在ItemsControl. 你可以ListBox改用。

于 2012-06-08T08:13:30.427 回答
0

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

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

于 2012-06-13T03:40:48.583 回答
0

聚会有点晚了,但我遇到了同样的问题,希望这可以帮助其他人,这是我推出自己的 SelectedItem 的方式,因为我不想使用 ListBox。

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

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

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

通过使用此示例,您应该能够大致了解并在您的业务服务中设置 Selected 项。

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

然后在您的用户控件/窗口代码中,您可以跟踪所选项目,如下所示:

/// <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;

    }



}
于 2014-09-02T19:21:05.633 回答