我有一个与viewModel.CurrentProduct.ProductAddOns的列表

<ListView ItemsSource="{Binding CurrentProduct.ProductAddOns}" MaxHeight="200">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <WrapPanel>
                            <ComboBox ItemsSource="{Binding AllAddOns}" SelectedItem="{Binding AddOn}">
                                <ComboBox.ItemTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding Name}"/>
                                    </DataTemplate>
                                </ComboBox.ItemTemplate>
                            </ComboBox>

                            <TextBox Text="{Binding Quantity}" Width="100"
                                     Margin="8" VerticalAlignment="Center"/>
                        </WrapPanel>
                    </DataTemplate>

ViewModel代码

class AddOrUpdateProductDialogViewModel : BaseViewModel
{
    ProductRepository productRepository = new ProductRepository();
    TaxRepository taxRepository = new TaxRepository();
    CategoryRepository categoryRepository = new CategoryRepository();
    AddOnRepository addOnRepository = new AddOnRepository();

    public AddOrUpdateProductDialogViewModel()
    {
        CurrentProduct = new Product
        {
            Id = 0,
            ImageSource = new BitmapImage(new Uri(@"..\..\..\..\assets\Icon.png", UriKind.Relative))
        };
        FillDefaultData();
    }
    public AddOrUpdateProductDialogViewModel(int ProductId)
    {
        CurrentProduct = productRepository.GetById(ProductId);
        FillDefaultData();
        foreach (var item in AllCategories)
        {
            var pr = currentProduct.Categories.FirstOrDefault(p => p.Id == item.Model.Id);
            if (pr != null)
            {
                item.IsSelected = true;
            }
        }
        SelectedTax = currentProduct.Tax;
    }

    private Product currentProduct;
    public Product CurrentProduct
    {
        get { return currentProduct; }
        set
        {
            currentProduct = value;
            OnPropertyChanged("CurrentProduct");
        }
    }

    CheckListModel<Category> allCategories;
    public CheckListModel<Category> AllCategories
    {
        get { return allCategories; }
        set
        {
            allCategories = value;
            OnPropertyChanged("AllCategories");
        }
    }


    ObservableCollection<Tax> allTaxes;
    public ObservableCollection<Tax> AllTaxes
    {
        get { return allTaxes; }
        set
        {
            allTaxes = value;
            OnPropertyChanged("allTaxes");
        }
    }

    Tax selectedTax;
    public Tax SelectedTax
    {
        get
        {
            return selectedTax;
        }
        set
        {
            selectedTax = value;
            CurrentProduct.Tax = value;
            OnPropertyChanged("SelectedTax");
        }
    }


    ObservableCollection<AddOn> allAddOns;
    public ObservableCollection<AddOn> AllAddOns
    {
        get { return allAddOns; }
        set
        {
            allAddOns = value;
            OnPropertyChanged("AllAddOns");
        }
    }

    void FillDefaultData()
    {
        ICollection<ProductAddOn> addons = CurrentProduct.ProductAddOns;
        CurrentProduct.ProductAddOns = new ObservableCollection<ProductAddOn>(addons);
        AllAddOns = new ObservableCollection<AddOn>(addOnRepository.GetAll());

        AllCategories = new CheckListModel<Category>();
        AllTaxes = new ObservableCollection<Tax>(taxRepository.GetAll());
        foreach (var item in categoryRepository.GetAll())
        {
            if (!item.IsDeleted)
            {
                AllCategories.Add(new CheckListItemModel<Category> { Model = item });
            }
        }
    }

    RelayCommand addOrUpdateCommand;
    public RelayCommand AddOrUpdateCommand
    {
        get
        {
            return addOrUpdateCommand ??
                (addOrUpdateCommand = new RelayCommand(o =>
                {
                    currentProduct.Categories = new List<Category>();

                    currentProduct.Categories = AllCategories.GetChekedItemsModels();
                    productRepository.AddOrUpdate(CurrentProduct);

                    MessageBox.Show("Sucessfully Updated", "Updated", MessageBoxButton.OK, MessageBoxImage.Information);

                }));
        }
    }

    private RelayCommand addAddOnCommand;
    public RelayCommand AddAddOnCommand
    {
        get
        {
            return addAddOnCommand ?? (addAddOnCommand = new RelayCommand((o) =>
            {
                currentProduct.ProductAddOns.Add(new ProductAddOn());

            }));
        }
    }

在dataTemplate的ListView内,我具有要绑定viewModel.AllAddons的ComboBox。 但是绑定AllAdOns试图在ProductAddOn class找到AllAddOns属性。

如何从dataContext(viewModel绑定AllAddOns?

#1楼 票数:1 已采纳

您需要的是

<ComboBox 
    ItemsSource="{Binding DataContext.AllAddOns,RelativeSource={RelativeSource FindAncestor,AncestorType=ListView}" 
    SelectedItem="{Binding AddOn}"
    >

  ask by Erik Hakobyan translate from so

未解决问题?本站智能推荐:

2回复

(WPF/C#)绑定到方法内部的对象

为了更好地理解DataContext和绑定,我尝试举一个示例,其中TextBlock显示对象的属性,该属性值由DispatcherTimer决定。 但是,TextBlock将不显示任何值。 MainWindow.xaml: MainWindow.xaml.cs Observable
2回复

WPF基本绑定

我知道这个问题已经问了很多遍了,但是无论我读了多少教程,我都无法理解。 我有一个带有三个ColumnDefinitions的网格,可以通过两个GridSplitters调整其大小。 我想要的是它下面的另一个网格,其中三个ColumnDefinitions随顶部网格的大小调整而调整大小(非常类
1回复

WPF,TreeView,绑定到Collection中对象内部的属性

这可能并不难,但是我越来越困惑。 我想在我的视图中显示一个TreeView,但是我无法正确获得数据绑定。 TemplateFamilyList集合是根对象。 它将包含TemplateFamily对象的列表。 每个TemplateFamily对象将包含一个Template对象和一个Te
1回复

WPF绑定到已经绑定的属性

如果我想绑定到已经绑定到其他东西的某个属性,该怎么办? 就我而言,我有一个带有TextBox的窗口。 此TextBox的Text属性是绑定到其selectedItem组合框的数据。 我的Window类有一个公共字符串属性,我想用TextBox中的任何值更新它,因此我想用Text属性进行数
1回复

绑定到绑定:WPF中的数据绑定间接-或-元绑定

除非通过示例,否则无法解释此问题: 假设您有一个带有两个DependencyProperty的自定义UserControl ,分别是StatList Stats和string ImportantStat 。 用户控件的工作是显示一个表,该表显示Stats所有值,但对ImportantSta
2回复

WPF共享的DataContext/绑定

我目前在WPF中的绑定存在问题。 我有一个两选项卡的应用程序。 第一个选项卡包含一个由列表填充的datagrid控件。 第二个选项卡包含一个由列表填充的列表框控件。 问题是如果我在第一个选项卡上运行检查,并且它在数据网格中返回例如5行,则第二个选项卡将填充5个虚拟列表框项。 因此,控件
4回复

WPF绑定错误

我真的不明白我在做什么错。 这些是我的课程: 我在XAML中有一个ListBox ,并且正在尝试将其绑定到MainWindow.wn.mwvm.filtros 。 (假设我想将其绑定到Filtro.url字段)。 通过此代码,我得到: 无法创建默认转换器以在类型“ System
1回复

WPF绑定TabControlTabItem

我对WPF中的MVVM相对较新,并且已经尝试解决几天了。 我正在使用dragablz选项卡控件并绑定ItemsSource,它是对象的ObservableList。 Tab项的内容是一个UserControl。 其datacontext为null 。 我创建了一个简单的设置来演示我遇到的