C# 绑定未更新的Listivew
我有一个绑定的listview,它没有更新。有人能找到窃听器吗?我希望我有一些钱,因为我会提供一个奖励 在这个屏幕盖中,当特定恐龙的状态发生变化时,右侧的窗口(活动恐龙列表)不会更新(请注意,当您单击恐龙(在本例中为Nancy)时,它正确地显示其状态为“移动到食物”,而活动恐龙列表显示其仍在休息: 以下是所有相关代码,从窗口的XAML开始:C# 绑定未更新的Listivew,c#,wpf,listview,binding,C#,Wpf,Listview,Binding,我有一个绑定的listview,它没有更新。有人能找到窃听器吗?我希望我有一些钱,因为我会提供一个奖励 在这个屏幕盖中,当特定恐龙的状态发生变化时,右侧的窗口(活动恐龙列表)不会更新(请注意,当您单击恐龙(在本例中为Nancy)时,它正确地显示其状态为“移动到食物”,而活动恐龙列表显示其仍在休息: 以下是所有相关代码,从窗口的XAML开始: <Window x:Class="DinosaurIsland.ActiveDinosaurList" xmlns="http://sche
<Window x:Class="DinosaurIsland.ActiveDinosaurList"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DinosaurIsland"
Title="ActiveDinosaurList" Height="850" Width="245" WindowStyle="SingleBorderWindow" Icon="/DinosaurIsland;component/Icon1.ico" ResizeMode="NoResize" >
<Window.Resources>
<local:EnergyBarColorConverter x:Key="EnergyBarColorConverter"/>
<local:DinoStatusConverter x:Key="DinoStatusConverter"/>
<DataTemplate x:Key="DinosaurInfo">
<StackPanel Orientation="Vertical" >
<Label Name="DinosaurName" Margin="0,0,0,-8" Content="{Binding Path=PersonalName}"/>
<Label Name="DinosaurSpecies" Margin="0,0,0,-8" FontStyle="Italic" Content="{Binding Path=Specie}"/>
<Label Name="DinosaurStatus" Margin="0,0,0,-8" Content="{Binding Path=State, Converter={StaticResource DinoStatusConverter}}"/>
<Label HorizontalAlignment="Center" Margin="0,0,0,-2" Content="Energy" />
<ProgressBar Name="Health" Margin="0,0,0,10" HorizontalAlignment="Center" VerticalAlignment="Top" Width="160" Height="15"
Foreground ="{Binding Path=Health, Converter={StaticResource EnergyBarColorConverter}}" Value="{Binding Path=Health}" />
<Separator/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid Width="210">
<ListView x:Name="DinoListView" Width="207" ItemsSource="{Binding Path=Dinosaurs}" HorizontalAlignment="Left" Margin="3,0,0,0">
<ListView.View>
<GridView>
<GridViewColumn Width="180" Header="Select Dinosaur" CellTemplate="{StaticResource DinosaurInfo}" />
</GridView>
</ListView.View>
</ListView>
</Grid>
这应该是拼图的所有部分。我遗漏了什么
谢谢…我将以你的名字命名恐龙。在绑定中使用
UpdateSourceTrigger=PropertyChanged
因此,您的标签将如下所示:
在绑定中使用UpdateSourceTrigger=PropertyChanged
所以你的标签应该是这样的:
好的,看看你的源代码就可以为你的用例找到一个解决方案。我确实建议正确地检查MVVM。就目前的情况来看,你的项目在很多方面都与MVVM相悖,正如我在聊天中提到的
将此与当前实现放在一起,使恐龙
列表与活动恐龙列表
视图同步,以下是我所做的更改:
MainWindow.xaml.cs:
1) 将恐龙
切换到可观察集合
和属性。比如
public static List<Dinosaur> Dinosaurs = new List<Dinosaur>();
ViewModel.cs
3) 将恐龙
属性切换为主窗口中的静态属性,并删除备份集合。比如
private ObservableCollection<Dinosaur> _dinoList = new ObservableCollection<Dinosaur>();
public ObservableCollection<Dinosaur> Dinosaurs
{
get { return _dinoList; }
set { _dinoList = value; RaisePropertyChanged("Dinosaurs"); }
}
到
就这样。现在运行您的模拟,当我转发时间时,我可以看到ActiveDigons列表上的状态得到了很好的更新 好的,查看源代码后,可以为您的用例找到解决方案。我确实建议正确地检查MVVM。就目前情况而言,正如我在聊天中提到的,您的项目在很多方面都与MVVM相悖
将此与当前实现放在一起,使恐龙
列表与活动恐龙列表
视图同步,以下是我所做的更改:
MainWindow.xaml.cs:
1) 将恐龙
切换到可观察集合
和属性。比如
public static List<Dinosaur> Dinosaurs = new List<Dinosaur>();
ViewModel.cs
3) 将恐龙
属性切换为主窗口中的静态属性,并删除备份集合。比如
private ObservableCollection<Dinosaur> _dinoList = new ObservableCollection<Dinosaur>();
public ObservableCollection<Dinosaur> Dinosaurs
{
get { return _dinoList; }
set { _dinoList = value; RaisePropertyChanged("Dinosaurs"); }
}
到
就这样。现在运行您的模拟,当我转发时间时,我可以看到ActiveDigons列表上的状态得到了很好的更新 在ViewModel中,您访问和创建恐龙属性的主窗口是什么?如果您只是对主窗口中的恐龙属性项进行了更改,它将不会更新ViewModel的恐龙属性中的项,因为它在创建时是一个值副本,并且似乎没有任何事件根据源的属性更改保持同步。为什么在主窗口和ViewModel中都有属性。只要有一个集合,让两个类访问同一个列表(模型),恐龙到处都在使用。这是它们被创建的全局位置:publicstaticlist恐龙=newlist();然后是一个XML文件,从中填充列表。我可以重写它,使ViewModel直接链接到恐龙列表,而不是副本吗?几个问题(在我运行play a gig之前):1)我如何使恐龙成为一个属性而不是一个简单的变量?我不理解上下文中的术语?2)我如何设置它,以便在创建(或死亡)新恐龙并更新恐龙时,它会反映在活动恐龙列表中?很抱歉,我的列表太密集了,但您是否建议在主窗口中使用“公共静态列表恐龙{get;set;}”,而不是公共静态列表恐龙=新列表()?静态MainWindow(){Digoros=newList();}将插入到哪里?在课堂上?无论我把它放在哪里,它都会抛出一个错误。在您的ViewModel中,您访问和创建恐龙属性的主窗口是什么?如果您只是对主窗口中的恐龙属性项进行了更改,它将不会更新ViewModel的恐龙属性中的项,因为它在创建时是一个值副本,并且似乎没有任何事件根据源的属性更改保持同步。为什么在主窗口和ViewModel中都有属性。只要有一个集合,让两个类访问同一个列表(模型),恐龙到处都在使用。这是它们被创建的全局位置:publicstaticlist恐龙=newlist();然后是一个XML文件,从中填充列表。我可以重写它,使ViewModel直接链接到恐龙列表,而不是副本吗?几个问题(在我运行play a gig之前):1)我如何使恐龙成为一个属性而不是一个简单的变量?我不理解上下文中的术语?2)我如何设置它,以便在创建(或死亡)新恐龙并更新恐龙时,它会反映在活动恐龙列表中?很抱歉,我的列表太密集了,但您是否建议在主窗口中使用“公共静态列表恐龙{get;set;}”,而不是公共静态列表恐龙=新列表()?静态MainWindow(){Digoros=newList();}将插入到哪里?在课堂上?无论我把它放在哪里,它都会抛出一个错误。我已经添加了(注意添加了逗号),但它仍然没有正确更新。OP的问题与这里的updateSourceRigger
无关。@Viv:是的,我不确定这一点。我也遇到了同样的问题,添加了UpdateSourceTrigger
修复了它。我添加了(注意添加了逗号),但它仍然不是updatei
public static ObservableCollection<Dinosaur> Dinosaurs { get; set; }
static MainWindow() {
Dinosaurs = new ObservableCollection<Dinosaur>();
}
private ObservableCollection<Dinosaur> _dinoList = new ObservableCollection<Dinosaur>();
public ObservableCollection<Dinosaur> Dinosaurs
{
get { return _dinoList; }
set { _dinoList = value; RaisePropertyChanged("Dinosaurs"); }
}
public ObservableCollection<Dinosaur> Dinosaurs {
get {
return MainWindow.Dinosaurs;
}
}
public ViewModel()
{
this.Dinosaurs = new ObservableCollection<Dinosaur>();
for(int i = 0; i < MainWindow.Dinosaurs.Count; i++)
this.Dinosaurs.Add(new Dinosaur()
{
PersonalName = MainWindow.Dinosaurs[i].PersonalName,
Specie = MainWindow.Dinosaurs[i].Specie,
Health = MainWindow.Dinosaurs[i].Health,
State = MainWindow.Dinosaurs[i].State
});
}
public ViewModel() {
MainWindow.Dinosaurs.CollectionChanged += (sender, args) => RaisePropertyChanged("Dinosaurs");
}