【问题标题】:How can I get SelectedItem and show Headers using ItemsControl?如何使用 ItemsControl 获取 SelectedItem 并显示标题?
【发布时间】:2012-06-08 08:10:56
【问题描述】:

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

谢谢,

【问题讨论】:

    标签: wpf wpf-controls itemscontrol


    【解决方案1】:

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

    【讨论】:

    • 是的,我试过了,但它的外观和感觉就像列表一样,我不想要那样。我可以在 ListBox 中使用 TextBox 吗?
    • 我要编辑意味着如果我想更改项目内容/值,我可以更改列表框中的值吗?
    • @R76,你可以用你的ItemsControl 做几乎相同的事情,你有SelectedItem 和SelectedItems 属性。
    【解决方案2】:

    聚会有点晚了,但我遇到了同样的问题,希望这可以帮助其他人这是我自己的 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;
    
        }
    
    
    
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-23
        相关资源
        最近更新 更多