Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绑定未更新的Listivew_C#_Wpf_Listview_Binding - Fatal编程技术网

C# 绑定未更新的Listivew

C# 绑定未更新的Listivew,c#,wpf,listview,binding,C#,Wpf,Listview,Binding,我有一个绑定的listview,它没有更新。有人能找到窃听器吗?我希望我有一些钱,因为我会提供一个奖励 在这个屏幕盖中,当特定恐龙的状态发生变化时,右侧的窗口(活动恐龙列表)不会更新(请注意,当您单击恐龙(在本例中为Nancy)时,它正确地显示其状态为“移动到食物”,而活动恐龙列表显示其仍在休息: 以下是所有相关代码,从窗口的XAML开始: <Window x:Class="DinosaurIsland.ActiveDinosaurList" xmlns="http://sche

我有一个绑定的listview,它没有更新。有人能找到窃听器吗?我希望我有一些钱,因为我会提供一个奖励

在这个屏幕盖中,当特定恐龙的状态发生变化时,右侧的窗口(活动恐龙列表)不会更新(请注意,当您单击恐龙(在本例中为Nancy)时,它正确地显示其状态为“移动到食物”,而活动恐龙列表显示其仍在休息:

以下是所有相关代码,从窗口的XAML开始:

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