【发布时间】:2018-03-24 07:43:56
【问题描述】:
我一直在使用Rubberduck 来改进我的 VBA 代码。鸭子向我介绍了单元测试和许多其他适当的技术。出于感激,我试图回馈并为我发现的问题提供解决方案,尽管我不懂 C#。
该问题涉及System.Windows.Controls.Grid。网格可以选择按结果或所在模块对测试结果进行分组。如果调整列宽,然后更改分组,则不会反映宽度变化。
我在视图模型上创建了我认为允许两种方式绑定的属性,如下所示。
private DataGridLength _outcomeColumnWidth;
public DataGridLength OutcomeColumnWidth
{
get => _outcomeColumnWidth;
set
{
_outcomeColumnWidth = value;
OnPropertyChanged();
}
}
我已经编辑了 XAML,试图创建一个 TwoWay 绑定,该绑定将在更改分组后保持更改的列宽。
<Grid>
<controls:GroupingGrid ItemsSource="{Binding Source={StaticResource ResultsByOutcome}}"
SelectedItem="{Binding SelectedTest}"
ShowGroupingItemCount="True"
Visibility="{Binding IsChecked, ElementName=GroupByOutcome, Converter={StaticResource BoolToVisibility}}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=TestExplorer_Outcome}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="unitTesting:TestMethod">
<Image Source="{Binding Result.Outcome, Converter={StaticResource OutcomeIconConverter}}" Height="16" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=TestExplorer_QualifiedModuleName}" Binding="{Binding Declaration.QualifiedName.QualifiedModuleName}"
Width="{Binding OutcomeColumnWidth, Mode=TwoWay}"/>
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=TestExplorer_MethodName}" Binding="{Binding Declaration.IdentifierName}"
Width="{Binding ModuleColumnWidth, Mode=TwoWay}"/>
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=TestExplorer_Message}" Binding="{Binding Result.Output}"
Width="{Binding MessageColumnWidth, Mode=TwoWay}"/>
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=TestExplorer_Duration}" Binding="{Binding Result.Duration, StringFormat={}{0}ms}"
Width="{Binding DurationColumnWidth, Mode=TwoWay}"/>
</DataGrid.Columns>
</controls:GroupingGrid>
<controls:GroupingGrid ItemsSource="{Binding Source={StaticResource ResultsByModule}}"
SelectedItem="{Binding SelectedTest}"
ShowGroupingItemCount="True"
Visibility="{Binding IsChecked, ElementName=GroupByLocation, Converter={StaticResource BoolToVisibility}}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=TestExplorer_Outcome}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate DataType="unitTesting:TestMethod">
<Image Source="{Binding Result.Outcome, Converter={StaticResource OutcomeIconConverter}}" Height="16" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=TestExplorer_QualifiedModuleName}" Binding="{Binding Declaration.QualifiedName.QualifiedModuleName}"
Width="{Binding OutcomeColumnWidth, Mode=TwoWay}"/>
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=TestExplorer_MethodName}" Binding="{Binding Declaration.QualifiedName.MemberName}"
Width="{Binding ModuleColumnWidth, Mode=TwoWay}"/>
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=TestExplorer_Message}" Binding="{Binding Result.Output}"
Width="{Binding MessageColumnWidth, Mode=TwoWay}"/>
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=TestExplorer_Duration}" Binding="{Binding Result.Duration, StringFormat={}{0}ms}"
Width="{Binding DurationColumnWidth, Mode=TwoWay}"/>
</DataGrid.Columns>
</controls:GroupingGrid>
</Grid>
视图模型继承自一个抽象类ViewModelBase,它实现了INotifyPropertyChanged。抽象类也有public event PropertyChangedEventHandler PropertyChanged 和方法OnPropertyChanged。我已经在 get 和 set 上为该属性设置了断点,但都没有到达。
【问题讨论】:
标签: c# data-binding wpf-controls