C# 绑定-动态选择ListView列的数据
情况是这样的:我有一个对象列表,每个对象都有一个ID号。我试图根据对象的ID号在listview的列中设置一个值:C# 绑定-动态选择ListView列的数据,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,情况是这样的:我有一个对象列表,每个对象都有一个ID号。我试图根据对象的ID号在listview的列中设置一个值: <ListView Name="Listview1" Itemsource="{Binding ObjectList}"> <ListView.View> <GridView> <GridViewColumn Header="Header1" Disp
<ListView Name="Listview1"
Itemsource="{Binding ObjectList}">
<ListView.View>
<GridView>
<GridViewColumn Header="Header1" DisplayMemberBinding="{Binding subObject.property}"/>
<GridViewColumn Header="Header2" DisplayMemberBinding="{Binding PropertyOfAnItemInAList"/>
</GridView>
</ListView.View>
</ListView>
ObjectList是ViewModel中的一个属性,它向ListView证明了一个ObservableCollection以进行处理。Header1和Header2绑定到名为“ObjectList”的ObservableCollection中的项内的属性
这一切对校长来说都很好。问题是Header2需要从ObservableCollection的每个元素内的列表中选择一个项,并基于ObjectList中引用项的另一个属性显示它
那我该怎么做呢
通过在ObjectList中的对象内部设置一个名为“currentSelection”的变量,我成功地使其工作,然后在绑定从ItemSource迭代ObjectList以生成ListView时设置该变量:
public ObservableCollection<theObject> ObjectList {
get {
foreach (theObject obj in sourceCollection) {
obj.CurrentID = MyID;
}
return new ObservableCollection<theObject>sourceCollection // <-- secondary question: Is this the best way to send an observableCollection to a View???
}
}
公共ObservableCollection对象列表{
得到{
foreach(sourceCollection中的对象对象){
obj.CurrentID=MyID;
}
返回新的ObservableCollectionsourceCollection/您只需要在ObjectInObjectList
类中的属性上实现。特别是,您需要告诉接口当CurrentID
属性发生更改时,PropertyOfanItemList
属性发生了更改:
public int CurrentID
{
get { return currentID; }
set
{
currentID = value;
NotifyPropertyChanged("CurrentID");
NotifyPropertyChanged("PropertyOfAnItemInAList");
}
}
每次更改CurrentID
属性时,此通知将更新UI中的propertyOfanItemInList
属性,因此您不需要任何特殊类型的绑定
我将从对象中删除CurrentID属性。我不希望在域对象中具有UI属性。我认为最好的解决方案是ion将对该列使用多重绑定,并从ViewModel中为其提供SortedList和MyID值,使用转换器从SortedList返回所选项目。类似于以下内容(假设列出的组合框也存在):
我不确定我是否理解您的问题。您是否只是在寻找将MyID放入标题为Header1的列的最佳方法?我重新阅读了它,现在认为您正在尝试将“Header2”列绑定到不同的属性,这取决于在另一个控件中选择的项目,您通过使用另一个带有开关的属性来完成(当前ID)根据具体情况返回特定属性的语句。这是否准确?您能显示对象的相关代码吗?Lee-这非常正确。我将在问题的编辑中添加相关代码。我明白您的意图,但这不是我要寻找的。填充ListView的对象在一个li中st,每个元素都有一个子元素列表,必须根据父元素的属性进行选择……。请这样想:诊所中有两组记录。第一组记录是医生,每个医生执行一项专门服务。第二组记录是患者。每个医生有多个患者,每个患者可以有多个患者iple医生。假设我们希望listview显示医生的患者,以及每个患者就诊的次数。因此,在本例中,我们在对象中的列表是患者的ID号,作为键的整数,该值是他们就诊的次数。你只是让你的生活像t一样复杂帽子。如果您使用分层数据对业务规则进行建模,它将大大简化您的UI。我的意思是有一个医生
对象和一个患者
对象……一个医生
将有一个可观察收集
和一个患者
将有一个可观察收集
等等。我们通过使用WPF和MVVM,在UI*中提供您所需的所有数据总是最容易的。谢谢。(+1)我会尝试一下。我还会看看Sheridan下面的评论,看看是否值得合并。我认为Sheridan也提出了一个很好的观点。如果成功,我会将此标记为答案。
public int CurrentID
{
get { return currentID; }
set
{
currentID = value;
NotifyPropertyChanged("CurrentID");
NotifyPropertyChanged("PropertyOfAnItemInAList");
}
}
<ComboBox Grid.Column="0" ItemsSource="{Binding Ids}" SelectedItem="{Binding MyID}" />
<ListView Name="Listview1" Grid.Column="1" ItemsSource="{Binding ObjectList}">
<ListView.View>
<GridView>
<GridViewColumn Header="Header1" DisplayMemberBinding="{Binding subObject.property}"/>
<GridViewColumn Header="Header2" >
<GridViewColumn.DisplayMemberBinding>
<MultiBinding Converter="{StaticResource IDictionarySelector}">
<Binding Path="PropertyOfAnItemInAList" />
<Binding Path="DataContext.MyID" RelativeSource="{RelativeSource AncestorType={x:Type Window}}" />
</MultiBinding>
</GridViewColumn.DisplayMemberBinding>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
public class IDictionarySelector : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values != null && values.Length == 2)
{
IDictionary idictionary = values[0] as IDictionary;
int? key = values[1] as int?;
if ((idictionary != null) && (key != null) && (idictionary.Contains(key)))
{
return idictionary[key].ToString();
}
}
return null;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}