C# WPF-MVVM-XAML绑定问题

C# WPF-MVVM-XAML绑定问题,c#,wpf,xaml,C#,Wpf,Xaml,我正在做一个简单的WPF应用程序,它有一个ViewModels的第一个可观察列表: public OuterViewModel CurrentItem { get; set; } public ObservableCollection<OuterViewModel> OuterItems { get; set; } Numbers对象只有五个数字属性。 关于XAML: <Window.DataContext> <local

我正在做一个简单的WPF应用程序,它有一个ViewModels的第一个可观察列表:

public OuterViewModel CurrentItem
{
    get;
    set;
}

public ObservableCollection<OuterViewModel> OuterItems
{
    get;
    set;
}
Numbers对象只有五个数字属性。 关于XAML:

<Window.DataContext>
    <local:MainWindowViewModel />
</Window.DataContext>
<ListBox Grid.Column="0" ItemsSource="{Binding OuterItems}" SelectedItem="{Binding CurrentItem}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <Label Content="{Binding Name}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
<ListView Grid.Column="1" ItemsSource="{Binding CurrentItem.Ruote}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding ?}"/>
                <GridViewColumn Header="Primo" />
                <GridViewColumn Header="Secondo" />
                <GridViewColumn Header="Terzo" />
                <GridViewColumn Header="Quarto" />
                <GridViewColumn Header="Quinto" />
            </GridView>
        </ListView.View>
    </ListView>

Listbox显示正确,而Intellisense表示我可以为ListView.ItemSource选择CurrentItem.Ruote。现在我想用Ruote项填充ListView的行,麻烦来了:我无法选择要放入单元格的InnerViewModel属性。
我做错了什么?

您需要一些东西来传达属性已更改的信息

您可以实现INotifyPropertyChanged接口。例如:

public class ViewModel : INotifyPropertyChanged
{
    private OuterViewModel currentItem;
    public OuterViewModel CurrentItem
    {
        get { return currentItem; }
        set
        {
            currentItem = value;
            NotifyPropertyChanged(nameof(CurrentItem));
        }
    }

    private void NotifyPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

DisplayMemberBinding=“{Binding Name}”
应该可以工作。您必须确保
CurrentItem
属性触发更改通知,例如INotifyPropertyChanged接口的PropertyChanged事件。我,我仍然没有完全理解这个邪恶系统背后的概念。C++不是那么复杂:顺便说一下,我还是不知道如何填充这些线…我之所以能够显示Continate,是因为我在各种对象中实现了ToString()方法。提示:如果您想查看您的值,可以使用来自任何控件的事件,并在该方法中设置断点(代码隐藏)。
<Window.DataContext>
    <local:MainWindowViewModel />
</Window.DataContext>
<ListBox Grid.Column="0" ItemsSource="{Binding OuterItems}" SelectedItem="{Binding CurrentItem}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <Label Content="{Binding Name}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
<ListView Grid.Column="1" ItemsSource="{Binding CurrentItem.Ruote}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding ?}"/>
                <GridViewColumn Header="Primo" />
                <GridViewColumn Header="Secondo" />
                <GridViewColumn Header="Terzo" />
                <GridViewColumn Header="Quarto" />
                <GridViewColumn Header="Quinto" />
            </GridView>
        </ListView.View>
    </ListView>
public class ViewModel : INotifyPropertyChanged
{
    private OuterViewModel currentItem;
    public OuterViewModel CurrentItem
    {
        get { return currentItem; }
        set
        {
            currentItem = value;
            NotifyPropertyChanged(nameof(CurrentItem));
        }
    }

    private void NotifyPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}