C# ListView中的WinRT MVVM灯光组合框具有不同的ItemsSource

C# ListView中的WinRT MVVM灯光组合框具有不同的ItemsSource,c#,listview,combobox,mvvm-light,winrt-xaml,C#,Listview,Combobox,Mvvm Light,Winrt Xaml,我正在开发一个WinRT应用程序,其中有一个带有组合框的Listview。 Listview有一个特定的ObservableCollection作为Itemssource,ComboBox应该有另一个ObservableCollection作为Itemssource,因为我应该能够动态更改ComboBox的内容 我使用的是MVVM Light框架,可观察集合填充在ViewModel中,并通过数据绑定显示 我将给出一个Xaml代码示例: <Page x:Class="MvvmLight2.M

我正在开发一个WinRT应用程序,其中有一个带有组合框的Listview。 Listview有一个特定的ObservableCollection作为Itemssource,ComboBox应该有另一个ObservableCollection作为Itemssource,因为我应该能够动态更改ComboBox的内容

我使用的是MVVM Light框架,可观察集合填充在ViewModel中,并通过数据绑定显示

我将给出一个Xaml代码示例:

<Page x:Class="MvvmLight2.MainPage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:ignore="http://www.ignore.com"
  mc:Ignorable="d ignore"
  d:DesignHeight="768"
  d:DesignWidth="1366"
  DataContext="{Binding Main, Source={StaticResource Locator}}">

<Page.Resources>

</Page.Resources>

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <ListView ItemsSource="{Binding CollectionOne}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding StringOne}"></TextBlock>
                    <ComboBox ItemsSource="{Binding CollectionTwo}" Width="500">
                    <ComboBox.ItemTemplate>
                        <DataTemplate>
                                <TextBlock Text="{Binding StringTwo}"></TextBlock>
                        </DataTemplate>
                    </ComboBox.ItemTemplate>
                </ComboBox>
               </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>  
    </ListView>
</Grid>

和相应的视图模型:

 public class MainViewModel : ViewModelBase
{
    private readonly IDataService _dataService;
    public MainViewModel(IDataService dataService)
    {
        _dataService = dataService;
        CollectionOne = new ObservableCollection<ClassOne>();
        for (int i = 0; i < 4; i++)
        {
            var temp = new ClassOne()
            {
                StringOne = "String " + i.ToString()
            };
            CollectionOne.Add(temp);
        }

        CollectionTwo = new ObservableCollection<ClassTwo>();
        CollectionTwo.Add(new ClassTwo("ADV"));
        CollectionTwo.Add(new ClassTwo("Wettelijk"));

    }

    private ObservableCollection<ClassOne> _collectionOne;
    public ObservableCollection<ClassOne> CollectionOne
    {
        get { return _collectionOne; }
        set
        {
            if (_collectionOne == value)
            {
                return;
            }
            _collectionOne = value;
            RaisePropertyChanged(() => CollectionOne);
        }
    }

    private ObservableCollection<ClassTwo> _collectionTwo;
    public ObservableCollection<ClassTwo> CollectionTwo
    {
        get { return _collectionTwo; }
        set
        {
            if (_collectionTwo == value)
            {
                return;
            }
            _collectionTwo = value;
            RaisePropertyChanged(() => CollectionTwo);
        }
    }

}
public类MainViewModel:ViewModelBase
{
私有只读IDataService(数据服务);
公共主视图模型(IDataService数据服务)
{
_数据服务=数据服务;
CollectionOne=新的ObservableCollection();
对于(int i=0;i<4;i++)
{
var temp=new ClassOne()
{
StringOne=“String”+i.ToString()
};
采集酮添加(温度);
}
CollectionTwo=新的ObservableCollection();
集合二。添加(新类别二(“ADV”);
集合二。添加(新的类别二(“Wettelijk”);
}
私人可观测收集(collectionOne);;
公共可观测收集
{
获取{return\u collectionOne;}
设置
{
如果(_collectionOne==值)
{
返回;
}
_collectionOne=值;
RaisePropertyChanged(()=>CollectionOne);
}
}
私人可观测收集2;
公共可观测集合2
{
获取{return\u collectionTwo;}
设置
{
if(_collectionTwo==值)
{
返回;
}
_集合二=值;
RaisePropertyChanged(()=>集合二);
}
}
}
例如,在ClassOne和ClassTwo中,每个类中只有一个带有字符串的属性

两个集合必须保持分离,因为随机填充时,它们的长度可能不同

编辑 @Josh我按照你的指示做了,但似乎仍然不起作用,以下是我的调整:

<Page x:Class="MvvmLight2.MainPage"
  x:Name="MyControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:ignore="http://www.ignore.com"
    mc:Ignorable="d ignore"
    d:DesignHeight="768"
    d:DesignWidth="1366"
    DataContext="{Binding Main, Source={StaticResource Locator}}">

<Page.Resources>

</Page.Resources>

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <ListView ItemsSource="{Binding CollectionOne}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding StringOne}"></TextBlock>
                    <ComboBox ItemsSource="{Binding ElementName=MyControl, Path=CollectionTwo}" Width="500">
                        <ComboBox.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding StringTwo}"></TextBlock>
                            </DataTemplate>
                        </ComboBox.ItemTemplate>
                    </ComboBox>
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>


组合框绑定与ListItem的绑定相关。因此,它将Collection2作为ClassOne的属性进行搜索。查看要绑定到的RelativeSource,或者将CollectionTwo移动到class One。这样,您就可以轻松地为每个ListViewItem建立不同的列表。

组合框绑定与ListItem的绑定相关。因此,它将Collection2作为ClassOne的属性进行搜索。查看要绑定到的RelativeSource,或者将CollectionTwo移动到class One。这样,您就可以轻松地为每个ListViewItem建立不同的列表。

您需要在datacontext中向上移动一个级别来搜索视图模型,而不是使用RelativeSource在列表视图级别绑定的项目:

<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type Page}}, Path=CollectionTwo}" />
而不是按AncestorType进行搜索,并为页面命名为“MyControl”。然后看起来像

 <ComboBox ItemsSource="{Binding ElementName=MyControl, Path=DataContext.CollectionTwo}" />

你的页面看起来像

<Page x:Name="MyControl"

您需要在datacontext中向上移动一级以搜索视图模型,而不是使用RelativeSource在列表视图级别绑定的项:

<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type Page}}, Path=CollectionTwo}" />
而不是按AncestorType进行搜索,并为页面命名为“MyControl”。然后看起来像

 <ComboBox ItemsSource="{Binding ElementName=MyControl, Path=DataContext.CollectionTwo}" />

你的页面看起来像

<Page x:Name="MyControl"

由于您使用ViewModel定位器来设置datacontext,因此可以重用它来查找属性CollectionTwo

您的绑定将如下所示:

<ComboBox ItemsSource="{Binding Path=Main.CollectionTwo, Source={StaticResource Locator}}" />

由于您使用ViewModel定位器来设置datacontext,因此可以重用它来查找属性CollectionTwo

您的绑定将如下所示:

<ComboBox ItemsSource="{Binding Path=Main.CollectionTwo, Source={StaticResource Locator}}" />


您好,谢谢您的回答。但恐怕我不明白你想解释什么。我是一名学生程序员,所以我不了解所有内容。Collection2的范围与CollectionOne相同。但是您的绑定假定范围是CollectionOne的一项。这意味着,XAML试图将Collection2作为ClassOne的属性来查找。如果我正确理解了您的答案,我认为它在我的特定项目中不起作用。你能举个小例子说明一下吗?谢谢,谢谢你的回答。但恐怕我不明白你想解释什么。我是一名学生程序员,所以我不了解所有内容。Collection2的范围与CollectionOne相同。但是您的绑定假定范围是CollectionOne的一项。这意味着,XAML试图将Collection2作为ClassOne的属性来查找。如果我正确理解了您的答案,我认为它在我的特定项目中不起作用。你能举个小例子说明一下吗?谢谢,我键入了与您的答案相同的内容,+1首先完成此答案的问题是WinRT中没有AncestorType。你有解决办法吗?不过还是要谢谢你。@DrZoidberg更新了WinRT场景。@Josh我已经用你的输入更新了我的问题,但它似乎仍然不起作用。它不起作用,因为页面没有名为CollectionTwo的属性。路径应该是DataContext.CollectionTwo.ha,我输入了与您的答案相同的内容,+1代表fi