Caliburn.micro "sometimes" 绑定 BindableCollection 项
Caliburn.micro "sometimes" binding BindableCollection Items
我在使用 Caliburn 时遇到问题 有时 在我的视图模型上设置 属性,但并不总是触发 Setter。它似乎是随机的,它可能会在更改 DataGrid 中的 属性 时绑定回我的视图模型。
当我删除 Virtualization
属性时,它似乎根本不起作用。
我的一部分 SettingsView.xaml
<DataGrid ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
Height="150"
ItemsSource="{Binding AbilitySettingViewModels}"
AutoGenerateColumns="False" VirtualizingPanel.IsVirtualizing="False"
AlternatingRowBackground="WhiteSmoke">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Ability ID" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox cal:Bind.ModelWithoutContext="{Binding}" Text="{Binding Id}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Custom image" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox cal:View.Context="{Binding}" cal:Bind.ModelWithoutContext="{Binding}" Text="{Binding Image}" ToolTip="Provide a custom image to use for this Ability." />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Ability Border" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<xctk:ColorPicker cal:View.Context="{Binding}" cal:Bind.ModelWithoutContext="{Binding}" ColorMode="ColorPalette" SelectedColor="{Binding Border, Mode=TwoWay}" DisplayColorAndName="True" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Delete" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button cal:Action.TargetWithoutContext="{Binding}" Padding="10,6" Content="Delete" cal:Message.Attach="Delete" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
我的SettingsViewModel
包含以下属性
// AbilitySettingViewModel is a row Item in the DataGrid
public BindableCollection<AbilitySettingViewModel> AbilitySettingViewModels { get; set; }
我已经尝试了所有 cal:Bind
和 cal:View
选项,看看它们中的任何一个是否对 <DataTemplate>
中的每个单独控件产生了影响,但似乎没有工作过
最初我只有 {Binding ViewModelProperty}
但它没有用。然后看到另一个 DataGrid 问题并通过添加 Action.TargetWithoutContext="{Binding}"
设法让按钮触发我的视图模型上的方法。但是其他列中的其他属性仍然没有运气。
是否有任何已知问题或解决方法可以让 Caliburn 与 DataGrid 一起工作?
我正在使用 Caliburn.micro 2.0.2。
Full SettingsView.xaml
here (Gist link)
Full SettingsViewModel.cs
here (Gist link)
Full AbilitySettingViewModel.cs
here (Gist link)
事件在正常设置下触发良好。当设置更改时,这将被序列化为一个 settings.json 文件,非常好。它似乎也正在加载 settings.json 很好,甚至对于序列化的子视图模型(AbilitySettingsViewModel),它们似乎已加载到设置了正确值的 DataGrid 中......只是编辑它们不起作用。
使用 "Delete" 按钮工作正常,序列化删除项目,这按预期工作。
无需尝试自定义 Caliburn 绑定。每个需要设置的只是 Path=PROPERTY
。
我在使用 Caliburn 时遇到问题 有时 在我的视图模型上设置 属性,但并不总是触发 Setter。它似乎是随机的,它可能会在更改 DataGrid 中的 属性 时绑定回我的视图模型。
当我删除 Virtualization
属性时,它似乎根本不起作用。
我的一部分 SettingsView.xaml
<DataGrid ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
Height="150"
ItemsSource="{Binding AbilitySettingViewModels}"
AutoGenerateColumns="False" VirtualizingPanel.IsVirtualizing="False"
AlternatingRowBackground="WhiteSmoke">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Ability ID" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox cal:Bind.ModelWithoutContext="{Binding}" Text="{Binding Id}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Custom image" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox cal:View.Context="{Binding}" cal:Bind.ModelWithoutContext="{Binding}" Text="{Binding Image}" ToolTip="Provide a custom image to use for this Ability." />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Ability Border" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<xctk:ColorPicker cal:View.Context="{Binding}" cal:Bind.ModelWithoutContext="{Binding}" ColorMode="ColorPalette" SelectedColor="{Binding Border, Mode=TwoWay}" DisplayColorAndName="True" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Delete" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button cal:Action.TargetWithoutContext="{Binding}" Padding="10,6" Content="Delete" cal:Message.Attach="Delete" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
我的SettingsViewModel
包含以下属性
// AbilitySettingViewModel is a row Item in the DataGrid
public BindableCollection<AbilitySettingViewModel> AbilitySettingViewModels { get; set; }
我已经尝试了所有 cal:Bind
和 cal:View
选项,看看它们中的任何一个是否对 <DataTemplate>
中的每个单独控件产生了影响,但似乎没有工作过
最初我只有 {Binding ViewModelProperty}
但它没有用。然后看到另一个 DataGrid 问题并通过添加 Action.TargetWithoutContext="{Binding}"
设法让按钮触发我的视图模型上的方法。但是其他列中的其他属性仍然没有运气。
是否有任何已知问题或解决方法可以让 Caliburn 与 DataGrid 一起工作?
我正在使用 Caliburn.micro 2.0.2。
Full SettingsView.xaml
here (Gist link)
Full SettingsViewModel.cs
here (Gist link)
Full AbilitySettingViewModel.cs
here (Gist link)
事件在正常设置下触发良好。当设置更改时,这将被序列化为一个 settings.json 文件,非常好。它似乎也正在加载 settings.json 很好,甚至对于序列化的子视图模型(AbilitySettingsViewModel),它们似乎已加载到设置了正确值的 DataGrid 中......只是编辑它们不起作用。
使用 "Delete" 按钮工作正常,序列化删除项目,这按预期工作。
无需尝试自定义 Caliburn 绑定。每个需要设置的只是 Path=PROPERTY
。