1

Silverlightで奇妙な問題に直面しましたDataGrid。構造体のリスト(に配置ViewModel)をグリッド値にバインドすると、正しく表示されますが、何らかの理由で、グリッドに加えられた変更はに反映されませんViewModel

public struct ObjectSelection 
{
    public bool Selected { get; set; }
    public string Name { get; set; }
}

public List<ObjectSelection> SelectedObjects
{
    get { return _selectedObjects; }
    set
    {
        if (value != _selectedObjects)
        {
            _selectedObjects= value;
            FirePropertyChanged("SelectedObjects");
        }
    }
}

XAML:

<navigation:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding SelectedObjects, Mode=TwoWay}"                                    
    <navigation:DataGrid.Columns>
        <navigation:DataGridFilterTemplateColumn Header="Selected"
            CanUserFilter="True"
            CanUserSort="False"
            DataType="Boolean"
            SortMemberPath="Include">
            <navigation:DataGridFilterTemplateColumn.CellTemplate>
                <DataTemplate>
                    <controls:CheckBox HorizontalAlignment="Center"
                        VerticalAlignment="Center"
                        IsChecked="{Binding Selected, Mode=TwoWay}"/>
                </DataTemplate>
            </navigation:DataGridFilterTemplateColumn.CellTemplate>
        </navigation:DataGridFilterTemplateColumn>                                        
        <navigation:DataGridFilterColumn Header="Dimension"
            DataType="String" 
            CanUserFilter="False"
            IsReadOnly="True"
            Binding="{Binding Name}" 
            CanUserSort="True"                                              
            SortMemberPath="Name"
            Width="*"/>
    </navigation:DataGrid.Columns>
</navigation:DataGrid>
4

1 に答える 1

1

ObjectSelectionとして定義するべきではありませんstruct

Astructは、プロパティから読み取られるたびにコピーされます。そのコピーはバインドに使用されます。その後、そのコピーがユーザーによって変更された場合、元のコピーは変更されません。classの代わりに使用することをお勧めしますstruct。ほとんどすべての場合、クラスがより良い選択です。

Microsoftの推奨事項

タイプのインスタンスが小さく、一般的に短命であるか、一般的に他のオブジェクトに埋め込まれている場合は、クラスの代わりに構造を定義することを検討してください。

タイプに次のすべての特性がない限り、構造を定義しないでください。

  • プリミティブ型(integer、doubleなど)と同様に、単一の値を論理的に表します。
  • インスタンスサイズが16バイト未満です。
  • 不変です。
  • 頻繁に箱詰めする必要はありません。
于 2012-10-16T13:51:24.707 に答える