【问题标题】:How to use ComboBox SelectedItem inside of ItemsControl DataTemplate如何在 ItemsControl DataTemplate 中使用 ComboBox SelectedItem
【发布时间】:2014-08-14 18:56:48
【问题描述】:

我正在处理一个表单来将项目添加到订单中。我对项目区域 XAML 的内容是这样的:

<ItemsControl Name="ServiceItems" ItemsSource="{Binding ServiceOrderItems}" Width="737" Canvas.Left="0" Canvas.Top="193" Visibility="{Binding ShowServiceItems, Converter={StaticResource BooleanToVisibility}}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>

                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="140*" />
                    <ColumnDefinition Width="320*" />
                    <ColumnDefinition Width="54*" />
                    <ColumnDefinition Width="35*" />
                    <ColumnDefinition Width="47*" />
                    <ColumnDefinition Width="47*" />
                    <ColumnDefinition Width="47*" />
                    <ColumnDefinition Width="47*" />
                </Grid.ColumnDefinitions>

                <ComboBox ItemsSource="{Binding ElementName=ServiceItems, Path=DataContext.ItemsList}" SelectedItem="{Binding Path=Item, Mode=TwoWay}" IsTextSearchEnabled="True">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="SelectionChanged">
                            <i:InvokeCommandAction Command="{Binding ElementName=ServiceItems, Path=DataContext.CommandAddServiceItem}"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </ComboBox>
                <TextBox Text="{Binding Description, Mode=TwoWay}" Grid.Column="1" />
                <TextBox Text="{Binding Available, Mode=TwoWay}" Grid.Column="2" />
                <TextBox Text="{Binding Quantity, Mode=TwoWay}" Grid.Column="3" />
                <TextBox Text="{Binding Rate, Mode=TwoWay}" Grid.Column="4" />
                <TextBox Text="{Binding Amount, Mode=TwoWay}" Grid.Column="5" />
                <CheckBox IsChecked="{Binding Taxable, Mode=TwoWay}" Grid.Column="6" />
                <CheckBox IsChecked="{Binding Closed, Mode=TwoWay}" Grid.Column="7" />
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>

    <ItemsControl.Template>
        <ControlTemplate TargetType="ItemsControl">
            <ScrollViewer CanContentScroll="True">
                <ItemsPresenter/>
            </ScrollViewer>
        </ControlTemplate>
    </ItemsControl.Template>

    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

这是我的 MVVM 类:

namespace ServiceOrders
{
    public class SalesOrderItem
    {
        public Int64 ItemId { get; set; }
        public string Item { get; set; }
        public string Description { get; set; }
        public int Available { get; set; }
        public double Quantity { get; set; }
        public double Rate { get; set; }
        public double Amount { get; set; }
        public bool Taxable { get; set; }
        public bool Closed { get; set; }

        public override string ToString()
        {
            return this.Item;
        }
    }

    public ObservableCollection<ServiceOrders.SalesOrderItem> ItemsList { get; set; }
    public ObservableCollection<ServiceOrders.SalesOrderItem> ServiceOrderItems { get; set; }

    public SalesOrderControlViewModel()
    {
        ItemsList = new ObservableCollection<ServiceOrders.SalesOrderItem>();
        ServiceOrderItems = new ObservableCollection<ServiceOrders.SalesOrderItem>();
    }
}

除了 ComboBox 之外,我的所有绑定似乎都有效。我想从项目列表 (ItemsList) 中提取,然后我想将 SelectedItem 添加到 ServiceOrderItems。当我选择项目时,它会添加它,但只添加SalesOrderItem.Item,不会添加描述、数量等。

如何实现我想做的事情?我尝试了以下方法:

<ComboBox ItemsSource="{Binding ElementName=ServiceItems, Path=DataContext.ItemsList}" SelectedItem="{Binding ElementName=ServiceItems, Path=DataContext.SelectedServiceItem, Mode=TwoWay}" IsTextSearchEnabled="True" DisplayMemberPath="Item">

但这只是将所有项目行组合框设置为相同的东西。我也尝试通过SelectionChanged 事件来实现它,然后尝试获取 SelectedItem 并将其添加到ServiceOrderItems

我找遍了所有地方,找不到任何符合我真正想做的事情。

【问题讨论】:

    标签: c# wpf mvvm combobox


    【解决方案1】:

    添加字符串是因为您已将 SelectedItem 与字符串值绑定,并且我怀疑在您的命令中您在命令中添加了所选项目。

    <ComboBox ItemsSource="{Binding ElementName=ServiceItems,
                                    Path=DataContext.ItemsList}"
              SelectedItem="{Binding Path=Item, Mode=TwoWay}">
    

    将 SelectedItem 绑定到 SalesOrderItem 类型的对象说 SelectedSalesOrderItem,以便您可以访问完整的对象。

    如果只是在组合框中显示项目,则不需要覆盖 ToString()。您可以使用 DisplayMemberPath 属性从对象的 UI 上显示特定属性。

    <ComboBox ItemsSource="{Binding ElementName=ServiceItems,
                                    Path=DataContext.ItemsList}"
              SelectedItem="{Binding Path=SelectedSalesOrderItem, Mode=TwoWay}"
              DisplayMemberPath="Item">
    

    【讨论】:

    • 是否需要我的 SalesOrderItem 类的 SelectedSalesOrderItem 属性?
    • 是的,你需要拥有 SalesOrderControlViewModel 类中的属性。
    猜你喜欢
    • 1970-01-01
    • 2012-07-30
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    相关资源
    最近更新 更多