我如何在另一个 ItemsControl 中绑定父 ItemsControl?
How i can Binding parent ItemControl inside another ItemControl?
我正在使用带有 MVVM 模式的 Wpf,所以在 Xamel 中我有一个 itemControl 持有另一个 itemcontrol 每个 itemcontrol 绑定来自不同的 ObservableCollection,结果它应该就像分组每个数据一样持有大量数据(类别和子类别) , 所以我从我的 viewmodel 绑定了 usercontrole 等等这是我的 viewModel 代码
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));
}
}
}
}
}
这里是 observable
里面的 class
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();
}
}
}
和下一个可观察的 class
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 子 itemcontrol 像父 itemcontrol 一样工作得很好 :),我做了一些小改动,这是 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 为我提供的帮助,
谢谢大家
我正在使用带有 MVVM 模式的 Wpf,所以在 Xamel 中我有一个 itemControl 持有另一个 itemcontrol 每个 itemcontrol 绑定来自不同的 ObservableCollection,结果它应该就像分组每个数据一样持有大量数据(类别和子类别) , 所以我从我的 viewmodel 绑定了 usercontrole 等等这是我的 viewModel 代码
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));
}
}
}
}
}
这里是 observable
里面的 classpublic 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();
}
}
}
和下一个可观察的 class
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 子 itemcontrol 像父 itemcontrol 一样工作得很好 :),我做了一些小改动,这是 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 为我提供的帮助, 谢谢大家