C# WPF-MVVM-XAML绑定问题
我正在做一个简单的WPF应用程序,它有一个ViewModels的第一个可观察列表: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
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;
}