【问题标题】:DataGrid. Struct property is not updated数据网格。结构属性未更新
【发布时间】:2012-10-16 13:46:11
【问题描述】:

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

【问题讨论】:

    标签: silverlight xaml data-binding struct


    【解决方案1】:

    您不应将ObjectSelection 定义为struct

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

    Microsofts recommendation

    考虑定义一个结构而不是一个类,如果 类型很小,通常寿命很短,或者通常嵌入 其他对象。

    不要定义结构,除非该类型具有以下所有条件 特点:

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

    【讨论】:

    • 感谢您的回答。其实我已经把ObjectSelection 改成了一个班级。但我只是想知道这种行为是否有任何有意义的原因。
    猜你喜欢
    • 2011-03-06
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 2011-04-02
    相关资源
    最近更新 更多