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:Bindcal: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