1

バインディング付きのリストビューがありますが、更新されていません。誰かがバグを見つけることができますか? 報酬を提供するので、お金があればいいのにと思います。

このスクリーン キャップでは、特定の恐竜のステータスが変化しているときに、右側のウィンドウ (アクティブな恐竜リスト) が更新されていません (恐竜 (この場合はナンシー) をクリックすると、正しく、彼女のアクティブな恐竜リストが彼女がまだ休んでいることを示している間、ステータスは「食べ物に移動中」です。

ここに画像の説明を入力

ウィンドウの 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>

恐竜クラスは次のとおりです。

using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;

namespace DinosaurIsland 
{
public class Dinosaur : INotifyPropertyChanged
{
    public string _specie;
    public string Specie
        {
        get { return _specie; }
        set{_specie = value; RaisePropertyChanged("Specie");}
        }
    public int Age { get; set; }
    public int Weight { get; set; }
    public double Height { get; set; }
    public int _health;
    public int Health 
        {
        get { return _health; }
        set{_health = value; RaisePropertyChanged("Health");}
        }
    public double Water { get; set; }
    public double FoodConsumed { get; set; }
    public bool Sex { get; set; }
    public string PersonalName { get; set; }
    public System.Windows.Point Head = new System.Windows.Point();
    public List<System.Windows.Point> Location { get; set; }
    public double Length { get; set; }
    public double Speed { get; set; }
    public byte _state;
    public byte State             
        {
        get { return _state; }
        set{_state = value; RaisePropertyChanged("State");}
        }
    public System.Windows.Point Goal = new System.Windows.Point();

    public System.Windows.Point[] FoodLocation = new System.Windows.Point[5]; // The last five locations that the dino found food
    public System.Windows.Point[] WaterLocation = new System.Windows.Point[5]; // The last five locations that the dino found water

    // Constructor
    public Dinosaur()
    {

    }

    public event PropertyChangedEventHandler PropertyChanged;
    //called when a property is changed
    protected void RaisePropertyChanged(string PropertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
        }
    }
}
}

ViewModel クラスは次のとおりです。

using System;
using System.Collections.Generic;
using System.Collections; 
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace DinosaurIsland
{
public class ViewModel : INotifyPropertyChanged
{
    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 event PropertyChangedEventHandler PropertyChanged;
    //called when a property is changed
    public void RaisePropertyChanged(string PropertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
        }
    }

    private ObservableCollection<Dinosaur> _dinoList = new ObservableCollection<Dinosaur>();
    public ObservableCollection<Dinosaur> Dinosaurs
    {
        get { return _dinoList; }
        set { _dinoList = value; RaisePropertyChanged("Dinosaurs"); }
    }
}

}

ウィンドウが呼び出される方法は次のとおりです。

// This is a global        
public ViewModel vm = new ViewModel();

// ....

// Instantiate window
ViewModel vm = new ViewModel();
DinoListDialogBox.DataContext = vm;
DinoListDialogBox.Show();

これでパズルのピースはすべて揃ったはずです。私は何が欠けていますか?

ありがとう…そして恐竜に君の名前を付けよう。

4

2 に答える 2

0

バインディング内でUpdateSourceTrigger=PropertyChanged.

したがって、ラベルは次のようになります<Label Name="DinosaurStatus" Margin="0,0,0,-8" Content="{Binding Path=State, Converter={StaticResource DinoStatusConverter} UpdateSourceTrigger=PropertyChanged}" />

于 2013-08-10T20:26:46.147 に答える