C# 绑定-动态选择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

情况是这样的:我有一个对象列表,每个对象都有一个ID号。我试图根据对象的ID号在listview的列中设置一个值:

<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();
    }
}