我遇到了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>
答案 0 :(得分:1)
您不应将ObjectSelection
定义为struct
。
每次从您的媒体资源中读取struct
。该副本用于绑定。如果用户随后修改了该副本,则原始文件保持不变。我建议您使用class
代替struct
。几乎在所有情况下,课程都是更好的选择。
如果是实例,请考虑定义结构而不是类 类型很小,通常是短暂的或通常嵌入 其他对象。
不定义结构,除非该类型具有以下所有内容 特性:
- 它逻辑上表示单个值,类似于基本类型(整数,双精度等)。
- 实例大小小于16个字节。
- 这是不可改变的。
- 不必频繁装箱。