c# - 我如何在另一个 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 不起作用并感谢大家
解决方案
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 为帮助我所做的努力,谢谢你们所有人
推荐阅读
- typescript - 有没有办法将语音中的“文本”保存为文本离子语音识别
- node.js - Google Cloud Function 无法识别 Papaparse 5.0 依赖项
- python-3.x - 如何使用 mpldatacursor 显示日期(X 轴)信息?
- xml - 从 Gradle 中的 FileTree 运行 Junit 测试
- python-3.x - 更改 PyOpenGL 小部件的透视图
- powershell - 有没有办法自动调用要在脚本中使用的文件?
- java - 如何在 Android 中使用 Java 显示图像?
- java - 如何使用 find() 方法从字符串中提取所有数字?
- javascript - 如何使计算按钮与已单击的特定功能一起使用
- c# - 如何保存 AndroidManifest.xml 文件 Unity?