2012-06-08 27 views
1

我正在使用WPF Windows应用程序。我正在使用ItemsControl来显示收藏列表。对此我发现ItemsControl中没有SelectedItem属性。那么我怎么才能从ItemsControl中获取选定的项目。还有我怎样才能显示ItemsControl的标题。如何获得SelectedItem并使用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> 

感谢,

回答

0

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

你可以阅读这个博客http://wp.me/p2dmA6-P如何使用HeaderedItemsControl?

1

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

+0

是的,我尝试过,但它使外观和感觉像列表,我不希望出现这种情况。我可以在ListBox中使用TextBox吗? – R76

+0

我可以在列表框中编辑列表框项目吗? – R76

+0

@ R76,“编辑”是什么意思? – Zabavsky

0

晚会有点晚,但我遇到了同样的问题,并希望这可以帮助别人在这里是我滚动我自己的SelectedItem,因为我不想使用ListBox。

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

在你SalesGrid,您可以添加的事件处理程序的MouseLeftButtonDown和的TouchDown事件,并使用Tag属性,以保持该项目的引用被渲染成这样:

请注意,在我的情况,我使用的是StackPanel而不是Grid,并且我没有编译下面的代码,只是为了说明目的。

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

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

    } 



} 
相关问题