gpt4 book ai didi

wpf - 将 ListBox 绑定(bind)到另一个 ListBox

转载 作者:行者123 更新时间:2023-12-03 10:19:46 27 4
gpt4 key购买 nike

我有 2 个列表框,如果您单击顶部的一个项目,那么底部的一个会过滤到一些结果。
我正在尝试学习 WPF 和 MVVM,并且想知道这是否是正确的方法。这是最好的方法吗?

这是我所做的:

class VisitInfoViewModel : ViewModelBase
{
List<ServiceType> serviceTypes;
List<ServiceType> allServiceTypes;
public VisitInfoViewModel()
{
ServiceCategories = ServiceCategory.Categories;
allServiceTypes = ServiceType.ServiceTypes;
}

public List<ServiceCategory> ServiceCategories { get; set; }
public List<ServiceType> ServiceTypes
{
get
{
return serviceTypes;
}
}

public ServiceCategory SelectedServiceCategory
{
get { return null; }
set
{
serviceTypes = allServiceTypes.FindAll(st => st.ServiceCategoryGuid.Equals(value.Guid));
OnPropertyChanged("ServiceTypes");
}
}
}

和 MainWindow.xaml 片段

<ListBox ItemsSource="{Binding Path=VisitInfo.ServiceCategories}" 
SelectedItem="{Binding Path=VisitInfo.SelectedServiceCategory}"
ItemTemplate="{StaticResource listBoxTemplate}"
Height="112"
HorizontalAlignment="Left"
Margin="6,30,0,0"
Name="lbxServiceCategory"
VerticalAlignment="Top"
Width="366" />

<ListBox ItemsSource="{Binding Path=VisitInfo.ServiceTypes}"
ItemTemplate="{StaticResource listBoxTemplate}"
HorizontalAlignment="Left"
Margin="6,0,0,19"
Name="lbxServiceType"
Width="366"
Height="121"
VerticalAlignment="Bottom" />

另外,为什么我不应该在我的 listBox 上为 selectedItemChanged 添加一个 EventHandler?
使用事件处理程序似乎更简单、更清晰。
我认为这是因为如果我这样做了,它就不再是 MVVM 了……对吗?
你会怎么做,最好的做法是什么?

最佳答案

您所做的大部分都很好 - 尽管我个人会制作 SelectedServiceCategory “真实”属性(具有已保存的值)。

与 MVVM 的区别以及在代码中执行它的区别在于您正在处理数据。如果您让“当前类别”更改类型,那么您只是在处理数据,根本不用担心 UI。您可以通过任何机制更改类别,并且 UI 将始终保持最新状态。

我个人建议这样写:

class VisitInfoViewModel : ViewModelBase
{
List<ServiceType> allServiceTypes;
public VisitInfoViewModel()
{
ServiceCategories = ServiceCategory.Categories;
allServiceTypes = ServiceType.ServiceTypes;
}

// This can use a private setter...
public IEnumerable<ServiceCategory> ServiceCategories { get; private set; }

private ServiceCategory currentCategory;
public ServiceCategory CurrentServiceCategory
{
get { return this.currentCategory; }
set
{
if (this.currentCategory != value)
{
this.currentCategory = value;
ServiceTypesInCurrentCategory = allServiceTypes.Where(st => st.ServiceCategoryGuid.Equals(this.currentCategory.Guid));
OnPropertyChagned("CurrentServiceCategory");
OnPropertyChanged("ServiceTypes");
}
}
}

public IEnumerable<ServiceType> ServiceTypesInCurrentCategory { get; private set; }
}

这提供了更改 CurrentServiceCategory 的完全自由。在代码中或通过 Xaml,没有任何事件处理程序。它还使您的 ViewModel 完全与数据相关-您不知道或不在乎用于显示此内容的内容-只要您的 View 中有设置 CurrentServiceCategory 的内容。 ,一切都保持正确同步。

also, why shouldn't I just add an EventHandler for selectedItemChanged on my listBox? It seems so much simpler and clearer to use the event handler. I think it is because if I did that it would no longer by MVVM... is that correct?



您可以这样做,但此时通常违反了 MVVM。主要问题是您将实现与该事件处理程序耦合 - 通过这样做,您基本上“锁定”了基于您在 View 中的代码的行为,用于 View 的这个特定实现。通过在 MVVM 方面保持“纯粹”,您的 View 可以自由更改(即:也许您希望有一天切换到 ServiceCategories 的组合框),而根本不需要接触您的 ViewModel 代码......

关于wpf - 将 ListBox 绑定(bind)到另一个 ListBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8449726/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com