3

オブジェクトのリストを複数のデータを含むグリッドとしてロードしようとしています。ここでわかるように、ListBox を選択しました。

<ListBox ItemsSource="{Binding People, Mode=TwoWay}" SelectedItem="{Binding Person, Mode=TwoWay}" >
  <ListBox.ItemContainerStyle>
     <Style TargetType="ListBoxItem">
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
     </Style>
  </ListBox.ItemContainerStyle>
  <ListBox.ItemTemplate>
     <DataTemplate>
         <Grid>
             <Grid.ColumnDefinitions>
                  <ColumnDefinition Width="200"></ColumnDefinition>
                  <ColumnDefinition Width="50"></ColumnDefinition>
                  <ColumnDefinition Width="30"></ColumnDefinition>
                  <ColumnDefinition Width="50"></ColumnDefinition>
                  <ColumnDefinition Width="20"></ColumnDefinition>
             </Grid.ColumnDefinitions>
             <TextBlock VerticalAlignment="Center" Text="{Binding name}" Grid.Column="0" TextAlignment="Right"></TextBlock>
             <TextBox Grid.Column="1" Margin="5,0,0,0" Height="Auto" VerticalAlignment="Center" HorizontalAlignment="Stretch" Text="{Binding age}"></TextBox>
             <TextBlock Grid.Column="2" Text="yo" VerticalAlignment="Center" Margin="5,0,0,0"></TextBlock>
             <TextBox Grid.Column="3" Margin="5,0,0,0" Height="Auto" VerticalAlignment="Center" HorizontalAlignment="Stretch" Text="{Binding baremo}"></TextBox>
             <TextBlock Grid.Column="4" Text="€" VerticalAlignment="Center" Margin="5,0,0,0"></TextBlock>
         </Grid>
    </DataTemplate>
 </ListBox.ItemTemplate>

データを People ObservableCollection にロードすると、すべてがうまくいき、完全に表示されます。

Person を初めて選択すると、それが機能し、VM にプロパティ値が設定されます。

問題は、別の「人物」を2 回目に選択したときに発生します。プロパティは変更されません...別のものを選択するたびに、少し時間がかかります(10 - 20の後ははるかに長くなります)。

これが私のViewModelコードです:

#region People
        public const string PeoplePropertyName = "People";

        private ObservableCollection<Player> _People;

        public ObservableCollection<Player> People
        {
            get
            {
                return _People;
            }

            set
            {
                _People = value;
                RaisePropertyChanged(People);
            }
        }
        #endregion

        #region Person
        public const string PersonPropertyName = "Person";

        private Player _Person;

        public Player Person
        {
            get
            {
                return _Person;
            }

            set
            {
                _Person = value;
                RaisePropertyChanged(PersonPropertyName);
            }
        }
        #endregion

そして、次のように People リストをロードしています。

void LoadPeople(GetPlayersEventArgs e)
{
     if (this.People == null) this.People = new ObservableCollection<Player>();

        foreach (Player Person in e.Result)
        {
            Player newPerson = new Player();
            ...
            this.People.Add(newPerson);
        }

        this.SetUnBusy();
}

私は何かが欠けていますか?? 前もって感謝します。

別の値を選択しようとするたびに私が見た @Ryan の質問の後、私は多くのことを得る:

ソリューションで「System.InvalidCastException」タイプの初回例外が発生しました

4

2 に答える 2

2

あなたが共有したことから、Personプロパティの実装は良好です。おすすめしたいことがいくつかあります。

vinod8812 が示唆するように、バインド モードを に変更するOneWayか、デフォルトのように削除しOneWayます。

<ListBox ItemsSource="{Binding People}" SelectedItem="{Binding Person, Mode=TwoWay}" >

ObservableCollection<Player>ViewModel にデータを入力する順序を変更します。

public class ViewModel
{
    private readonly ObservableCollection<Player>();

    public ViewModel()
    {
        _People = new ObservableCollection<Player>();
    }

    public ObservableCollection<Player> People
    {
        get
        {
            return _People;
        }
    }
    /* rest of class */
}

最後に、_Peopleコレクションを作成する前にコレクションをクリアします。そうしないと、重複を追加するだけになる可能性があります。

void LoadPeople(GetPlayersEventArgs e)
{
    _People.Clear();

    foreach (Player Person in e.Result)
    {
        Player newPerson = new Player();
        ...
        this.People.Add(newPerson);
    }

    this.SetUnBusy();
}

INotifyPropertyChanged.PropertyChangedのイベントにバインドされていることがわかっているものはありますViewModelか? あなたが共有したコードからは、何がアプリの速度を低下させているのか正確にはわかりません.

于 2012-09-04T18:29:05.520 に答える
1

CLR 例外がスローされたときに壊れる機能を有効にすることをお勧めします。Visual Studio 2010 または 2012 を使用している場合は、[デバッグ] -> [例外] (または既定では Ctrl-E、D キー) に移動し、[共通言語ランタイムの例外] の下で [スロー] がオンになっていることを確認します。次に、ソリューションを再実行して、問題が発生するかどうかを確認します。

次に、Person オブジェクトに問題が表示されます ;)

于 2012-09-04T19:30:07.113 に答える