数据网格。 Struct属性未更新

时间:2012-10-16 13:46:11

标签: silverlight xaml data-binding struct

我遇到了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>

1 个答案:

答案 0 :(得分:1)

您不应将ObjectSelection定义为struct

每次从您的媒体资源中读取struct 。该副本用于绑定。如果用户随后修改了该副本,则原始文件保持不变。我建议您使用class代替struct。几乎在所有情况下,课程都是更好的选择。

Microsofts recommendation

  

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

     

定义结构,除非该类型具有以下所有内容   特性:

     
      
  • 它逻辑上表示单个值,类似于基本类型(整数,双精度等)。
  •   
  • 实例大小小于16个字节。
  •   
  • 这是不可改变的。
  •   
  • 不必频繁装箱。
  •