首页 > 解决方案 > 我如何在另一个 ItemControl 中绑定父 ItemControl?

问题描述

我正在使用带有 MVVM 模式的 Wpf,所以在 Xamel 中,我有一个 itemControl 持有另一个 itemcontrol,每个 itemcontrol 绑定来自不同的 ObservableCollection,结果它应该像对每个数据进行分组一样持有数据的冲击力(类别和子类别),所以我从我的视图模型绑定用户控件等等这是我的视图模型代码

public class BudgetViewModel:ViewModelBase,IBudgetViewModel
    {
          public BudgetViewModel(IBudgetLookupsDataService BudgetLookupsDataService)
           {
                  CategoryBudgets = new ObservableCollection<CategoryBudgetItemsViewModel>();
                  SubCategoryBudgets = new ObservableCollection<SubCategoryBudgetItemsViewModel>();
           }
         public async Task LoadBudgetCategories()
         {
          var categories = await _budgetLookupsDataService.GetBugetCategory();
        
            CategoryBudgets.Clear();
           if(categories.Count()!=0)
             {
             foreach (var cat in categories)
               {
                var subcategory = await _budgetLookupsDataService
                       .GetBudgetSubCategoriesPerMounth(DateforSearch, cat.IdCategory);
                CategoryBudgets.Add(new CategoryBudgetItemsViewModel(cat.IdCategory, 
                                    cat.CategoryName));
                foreach (var sub in subcategory)
                {
                   
                    SubCategoryBudgets.Add(new SubCategoryBudgetItemsViewModel(sub.IdSubCategory, 
                                         sub.SubCategoryName, sub.BudgetId, sub.BudgetPerMonth));
                }
               
              }
           }
        }
    } 

这是可观察对象中的类

public class CategoryBudgetItemsViewModel:ViewModelBase
{
   public CategoryBudgetItemsViewModel(int categoryId,string categoryName)
       {
               CategoriesId = categoryId;
               CategoriesName = categoryName;
       }
     public int CategoriesId { get; set; }
  
    public string CategoriesName
    {
        get { return _categoriesName; }
        set 
        { 
            
            _categoriesName = value; 
            OnPropertyChanged();
            
        }
    }
}

和下一类下一个可观察的

 public class SubCategoryBudgetItemsViewModel: ViewModelBase
 {
    public SubCategoryBudgetItemsViewModel(int subcategoryId, string subcategoryname,
        int? idBudget, decimal budgetAmount)
         {
               SubCategoryId = subcategoryId;
               SubCategoryName = subcategoryname;
                BudgetId = idBudget;
              BudgetAmount = budgetAmount;
          }
              public int SubCategoryId { get; set; }
    public int? BudgetId { get; set; }
    public string SubCategoryName
    {
        get { return _subcategoryname; }
        set { _subcategoryname = value; OnPropertyChanged(); }
    }

    public decimal BudgetAmount
    {
        get { return _budgetamount; }
        set
        {
            _budgetamount = value;
            OnPropertyChanged();
        }
      }
   }

和我的 Xamel 代码:

       <ItemsControl x:Name="Item"  ItemsSource="{Binding CategoryBudgets}" >
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <Grid x:Name="GrdData" >
                                    <Expander Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2" 
                                   Header="{Binding CategoriesName}" Cursor="Hand" IsExpanded="True">
                                        <ItemsControl  ItemsSource="{Binding SubCategoryBudgets}" >
                                             <ItemsControl.ItemTemplate>
                                                      <DataTemplate>
                                                                                                                                           
                                                 <TextBlock Text="{Binding SubCategoryId}"/>

                                                      </DataTemplate>
                                              </ItemsControl.ItemTemplate>
                                      </ItemsControl>
                                   </Expander>
                                </Grid>
                             </DataTemplate>
                        </ItemsControl.ItemTemplate>
                      </ItemsControl>

当我运行 Expander 渲染并且绑定工作正常但另一个 itemcontrol 它根本不起作用所以我的问题是为什么内部 itemcontrol 不起作用并感谢大家

标签: c#wpfmvvmobservablecollection

解决方案


Finlay 子项控件与父项控件一样好用 :),我做了一些小改动,这是 CategoryBudgetItemsViewModel 中的更改

public class CategoryBudgetItemsViewModel : ViewModelBase
  {
public CategoryBudgetItemsViewModel(int categoryId, string categoryName)
{
    CategoriesId = categoryId;
    CategoriesName = categoryName;
   SubCategoryBudgets = new ObservableCollection<SubCategoryBudgetItemsViewModel>();
}
public int CategoriesId { get; set; }

public ObservableCollection<SubCategoryBudgetItemsViewModel> SubCategoryBudgets { get; set; }

public string CategoriesName
{
    get { return _categoriesName; }
    set
    {

        _categoriesName = value;
        OnPropertyChanged();

     }
  }
}

我在 CategoryBudgetItemsViewModel 中填充了 SubCategoryBudgets。这是 Xamel 代码:

<ItemsControl x:Name="Item"  ItemsSource="{Binding CategoryBudgets}" >
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Grid x:Name="GrdData" >
                                <Expander Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2" 
                               Header="{Binding CategoriesName}" Cursor="Hand" IsExpanded="True">
                                    <ItemsControl  ItemsSource="{Binding Path=SubCategoryBudgets}"
                                         <ItemsControl.ItemTemplate>
                                                  <DataTemplate>
                                                                                                                                       
                                             <TextBlock Text="{Binding Path=SubCategoryId}/>

                                                  </DataTemplate>
                                          </ItemsControl.ItemTemplate>
                                  </ItemsControl>
                               </Expander>
                            </Grid>
                         </DataTemplate>
                    </ItemsControl.ItemTemplate>
                  </ItemsControl>

谢谢@Clemens、@user1672994 和@icode 为帮助我所做的努力,谢谢你们所有人


推荐阅读