Caliburn.micro“有时”绑定BindableCollection项目

时间:2015-10-21 15:25:16

标签: wpf xaml data-binding wpfdatagrid caliburn.micro

我一直遇到Caliburn 有时在View Model上设置属性的问题,但并不总是触发Setter。在更改DataGrid中的属性时,它可能会绑定回我的View Model。

当我删除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}"让Button在我的视图模型上触发该方法。但是其他列中的其他属性仍然没有运气。

是否存在任何已知的问题或解决方法以使校准与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中并且设置了正确的值...只是编辑它们不起作用。

使用“删除”按钮工作正常,序列化将删除项目,该项目按预期工作。

1 个答案:

答案 0 :(得分:0)

无需尝试自定义校准绑定。所有需要设置的都是Path=PROPERTY