Browse Source

Merge remote-tracking branch 'origin/master' into feature/tray-icon-support

pull/6610/head
Dan Walmsley 5 years ago
parent
commit
7451e6bd2f
  1. 16
      src/Avalonia.Controls.DataGrid/DataGrid.cs
  2. 11
      src/Avalonia.Controls.DataGrid/DataGridDataConnection.cs
  3. 7
      src/Avalonia.Visuals/Visual.cs
  4. 1
      tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj
  5. 73
      tests/Avalonia.Base.UnitTests/Logging/LoggingTests.cs

16
src/Avalonia.Controls.DataGrid/DataGrid.cs

@ -4489,17 +4489,27 @@ namespace Avalonia.Controls
element = dataGridColumn.GenerateEditingElementInternal(dataGridCell, dataGridRow.DataContext); element = dataGridColumn.GenerateEditingElementInternal(dataGridCell, dataGridRow.DataContext);
if (element != null) if (element != null)
{ {
// Subscribe to the new element's events
element.Initialized += EditingElement_Initialized; dataGridCell.Content = element;
if (element.IsInitialized)
{
PreparingCellForEditPrivate(element as Control);
}
else
{
// Subscribe to the new element's events
element.Initialized += EditingElement_Initialized;
}
} }
} }
else else
{ {
// Generate Element and apply column style if available // Generate Element and apply column style if available
element = dataGridColumn.GenerateElementInternal(dataGridCell, dataGridRow.DataContext); element = dataGridColumn.GenerateElementInternal(dataGridCell, dataGridRow.DataContext);
dataGridCell.Content = element;
} }
dataGridCell.Content = element;
} }
private void PreparingCellForEditPrivate(Control editingElement) private void PreparingCellForEditPrivate(Control editingElement)

11
src/Avalonia.Controls.DataGrid/DataGridDataConnection.cs

@ -233,7 +233,7 @@ namespace Avalonia.Controls
else else
{ {
editableCollectionView.EditItem(dataItem); editableCollectionView.EditItem(dataItem);
return editableCollectionView.IsEditingItem; return editableCollectionView.IsEditingItem || editableCollectionView.IsAddingNew;
} }
} }
@ -314,7 +314,14 @@ namespace Avalonia.Controls
CommittingEdit = true; CommittingEdit = true;
try try
{ {
editableCollectionView.CommitEdit(); if (editableCollectionView.IsAddingNew)
{
editableCollectionView.CommitNew();
}
else
{
editableCollectionView.CommitEdit();
}
} }
finally finally
{ {

7
src/Avalonia.Visuals/Visual.cs

@ -489,11 +489,8 @@ namespace Avalonia
protected internal sealed override void LogBindingError(AvaloniaProperty property, Exception e) protected internal sealed override void LogBindingError(AvaloniaProperty property, Exception e)
{ {
// Don't log a binding error unless the control is attached to a logical or visual tree. // Don't log a binding error unless the control is attached to a logical tree.
// In theory this should only need to check for logical tree attachment, but in practise if (((ILogical)this).IsAttachedToLogicalTree)
// due to ContentControlMixin only taking effect when the template has finished being
// applied, some controls are attached to the visual tree before the logical tree.
if (((ILogical)this).IsAttachedToLogicalTree || ((IVisual)this).IsAttachedToVisualTree)
{ {
if (e is BindingChainException b && if (e is BindingChainException b &&
string.IsNullOrEmpty(b.ExpressionErrorPoint) && string.IsNullOrEmpty(b.ExpressionErrorPoint) &&

1
tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj

@ -14,6 +14,7 @@
<Import Project="..\..\build\SharedVersion.props" /> <Import Project="..\..\build\SharedVersion.props" />
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\Avalonia.Base\Avalonia.Base.csproj" /> <ProjectReference Include="..\..\src\Avalonia.Base\Avalonia.Base.csproj" />
<ProjectReference Include="..\..\src\Markup\Avalonia.Markup.Xaml.Loader\Avalonia.Markup.Xaml.Loader.csproj" />
<ProjectReference Include="..\Avalonia.UnitTests\Avalonia.UnitTests.csproj" /> <ProjectReference Include="..\Avalonia.UnitTests\Avalonia.UnitTests.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

73
tests/Avalonia.Base.UnitTests/Logging/LoggingTests.cs

@ -0,0 +1,73 @@
using Avalonia.Controls;
using Avalonia.Controls.Shapes;
using Avalonia.Markup.Xaml;
using Avalonia.UnitTests;
using Xunit;
namespace Avalonia.Base.UnitTests.Logging
{
public class LoggingTests
{
[Fact]
public void Control_Should_Not_Log_Binding_Errors_When_Detached_From_Visual_Tree()
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
var xaml = @"
<Window xmlns='https://github.com/avaloniaui'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
xmlns:local='clr-namespace:Avalonia.Base.UnitTests.Logging;assembly=Avalonia.UnitTests'>
<Panel Name='panel'>
<Rectangle Name='rect' Fill='{Binding $parent[Window].Background}'/>
</Panel>
</Window>";
var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
var calledTimes = 0;
using var logSink = TestLogSink.Start((l, a, s, m, d) =>
{
if (l >= Avalonia.Logging.LogEventLevel.Warning)
{
calledTimes++;
}
});
var panel = window.FindControl<Panel>("panel");
var rect = window.FindControl<Rectangle>("rect");
window.ApplyTemplate();
window.Presenter.ApplyTemplate();
panel.Children.Remove(rect);
Assert.Equal(0, calledTimes);
}
}
[Fact]
public void Control_Should_Log_Binding_Errors_When_No_Ancestor_With_Such_Name()
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
var xaml = @"
<Window xmlns='https://github.com/avaloniaui'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
xmlns:local='clr-namespace:Avalonia.Base.UnitTests.Logging;assembly=Avalonia.UnitTests'>
<Panel>
<Rectangle Fill='{Binding $parent[Grid].Background}'/>
</Panel>
</Window>";
var calledTimes = 0;
using var logSink = TestLogSink.Start((l, a, s, m, d) =>
{
if (l >= Avalonia.Logging.LogEventLevel.Warning && s is Rectangle)
{
calledTimes++;
}
});
var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
window.ApplyTemplate();
window.Presenter.ApplyTemplate();
Assert.Equal(1, calledTimes);
}
}
}
}
Loading…
Cancel
Save