1

これは私の作業コードです。

private ObservableCollection<User> _Users;
public ObservableCollection<User> Users 
{ 
     get { return _Users; } 
     set { _Users = value; RaisePropertyChanged(()=> Users); } 
}

Users = new ObservableCollection<User>();
for (int i = 1; i <= 10; i++)
{
    Users.Add(new User()
    {
        ADDRESS_LINE_1 = "Test Address",
        ADDRESS_LINE_2 = "Test Address 2",
        FIRST_NAME = "Test Name " + i,
        SURNAME = "Test surname " +i,
        DATE_OF_BIRTH = DateTime.Now.Date,
        GENDER = "M",
        MOBILE_PHONE_NUMBER = "+1100000",
        EMAIL_ADDRESS = "Test@email.com",
        LAST_MODIFIED = DateTime.Now,
        LOGIN_NAME ="operator.domain.com",
        ItemIndex = Users.Count +1

    });
}

以前私が使用している

private List<User> _Users;
public List<User> Users 
{ 
    get { return _Users; } 
    set { _Users = value; RaisePropertyChanged(()=> Users); } 
}

Users = new List<User>();
for (int i = 1; i <= 10; i++)
{
    Users.Add(new User()
    {
        ADDRESS_LINE_1 = "Test Address",
        ADDRESS_LINE_2 = "Test Address 2",
        FIRST_NAME = "Test Name " + i,
        SURNAME = "Test surname " +i,
        DATE_OF_BIRTH = DateTime.Now.Date,
        GENDER = "M",
        MOBILE_PHONE_NUMBER = "+9100000",
        EMAIL_ADDRESS = "Test@email.com",
        LAST_MODIFIED = DateTime.Now,
        LOGIN_NAME ="operator1.domain.com",
        ItemIndex = Users.Count +1
    });
}

xamlでデータテンプレートにバインドしようとすると、次の例外メッセージが継続的に表示されます

Value does not fall within the expected range. 

スタック トレースが null です :(

さらに、別のリスト変数を取得してそれらの値を追加し、そのリストの浅いコピーを上記のリストに割り当てると、コードは望ましい結果をもたらしますが、実際には何が起こっているのでしょうか。

これはデータテンプレートです

<DataTemplate>
            <Grid Margin="-8,-10,-8,-10" Background="{Binding ItemIndex, Converter={StaticResource AlternateRowBackgroundConverter}}">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"></ColumnDefinition>
                    <ColumnDefinition Width="*"></ColumnDefinition>
                    <ColumnDefinition Width="*"></ColumnDefinition>
                    <ColumnDefinition Width="*"></ColumnDefinition>
                    <ColumnDefinition Width="*"></ColumnDefinition>
                    <ColumnDefinition Width="*"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Border Grid.Column="0" Style="{StaticResource BorderStyleForAdmin}" Background="{Binding ItemIndex, Converter={StaticResource AlternateRowBackgroundConverter}}">
                    <StackPanel Orientation="Horizontal">
                        <!--<Border BorderBrush="Gray" BorderThickness="0.3" Visibility="{Binding IsSelectedItem, Mode=TwoWay, Converter={StaticResource ControlVisibiltyOfSelectedItemInListBox}}">
                            <TextBlock Text="{StaticResource ArrowGlyph}" Foreground="Black" VerticalAlignment="Center" HorizontalAlignment="Right"></TextBlock>
                        </Border>-->
                        <TextBlock Style="{StaticResource TextBlockCell}" Text="{Binding SURNAME}"></TextBlock>
                    </StackPanel>
                </Border>
                <Border Grid.Column="1" Style="{StaticResource BorderStyleForAdmin}" Background="{Binding ItemIndex, Converter={StaticResource AlternateRowBackgroundConverter}}">
                    <TextBlock Style="{StaticResource TextBlockCell}" Text="{Binding FIRST_NAME}"></TextBlock>
                </Border>
                <Border Grid.Column="2" Style="{StaticResource BorderStyleForAdmin}" Background="{Binding ItemIndex, Converter={StaticResource AlternateRowBackgroundConverter}}">
                    <TextBlock Style="{StaticResource TextBlockCell}" HorizontalAlignment="Stretch">
                        <Run Text="{Binding ADDRESS_LINE_1}"></Run><LineBreak></LineBreak>
                         <Run Text="{Binding ADDRESS_LINE_2}"></Run>
                    </TextBlock>
                </Border>
                <Border Grid.Column="3" Style="{StaticResource BorderStyleForAdmin}" Background="{Binding ItemIndex, Converter={StaticResource AlternateRowBackgroundConverter}}">
                    <TextBlock Style="{StaticResource TextBlockCell}" Text="{Binding DATE_OF_BIRTH}"></TextBlock>
                </Border>
                <Border Grid.Column="4" Style="{StaticResource BorderStyleForAdmin}" Background="{Binding ItemIndex, Converter={StaticResource AlternateRowBackgroundConverter}}">
                    <TextBlock Style="{StaticResource TextBlockCell}" Text="{Binding EMAIL_ADDRESS}"></TextBlock>
                </Border>
                <Border Grid.Column="5" Style="{StaticResource BorderStyleForAdmin}" Background="{Binding ItemIndex, Converter={StaticResource AlternateRowBackgroundConverter}}">
                    <TextBlock Style="{StaticResource TextBlockCell}" Text="{Binding MOBILE_PHONE_NUMBER}"></TextBlock>
                </Border>
            </Grid>
        </DataTemplate>

ただし、Observable コレクションは機能しますが、なぜ List がこの例外を与えているのか疑問に思っています。舞台裏の実際の理由を理解できません。前もって感謝します。

4

1 に答える 1

1

ここで私を悩ませているのは、 " RaisePropertyChanged" が使用されているObservableCollectionか、少なくともINotifyPropertyChangedインターフェイスを継承する必要があることだけです。2番目の実装リストでは、「RaisePropertyChanged」メソッドを取得していません。リスト宣言を次のように考えます。

private List<User> _Users;
public List<User> Users 
{ 
    get { return _Users; } 
    set { _Users = value;} 
}

これでエラーが解決するはずだと思います。ただし、これを行うと、オブジェクトの状態が (追加、削除、および変更) 変更されたときに、基になるコレクションまたはコンテナーに状態が変更されたことを通知する必要がある場合は常に、PropertyChanged イベントが発生しないことに注意してください。

詳細については、次を参照してください: List vs ObservableCollection vs INotifyPropertyChanged in Silverlight

于 2013-08-23T12:36:13.247 に答える