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

你不应该定义ObjectSelectionstruct.

每次从您的属性中读取A时struct都会复制它。该副本用于装订。如果该副本随后被用户修改,则原始副本保持不变。我建议你使用 aclass而不是 a struct。在几乎所有情况下,类都是更好的选择。

微软推荐

如果类型的实例很小且通常短暂存在或通常嵌入在其他对象中,请考虑定义结构而不是类。

除非类型具有以下所有特征,否则不要定义结构

  • 它在逻辑上表示单个值,类似于原始类型(整数、双精度等)。
  • 它的实例大小小于 16 字节。
  • 它是不可变的。
  • 它不必经常装箱。
于 2012-10-16T13:51:24.707 回答