Fix runtime crash when adding controls (anything other than MultiComboBoxItem with text content) to a MultiComboBox in axaml
This commit is contained in:
@@ -59,6 +59,8 @@
|
|||||||
<u:MultiComboBoxItem>option 1</u:MultiComboBoxItem>
|
<u:MultiComboBoxItem>option 1</u:MultiComboBoxItem>
|
||||||
<u:MultiComboBoxItem>option 2</u:MultiComboBoxItem>
|
<u:MultiComboBoxItem>option 2</u:MultiComboBoxItem>
|
||||||
<u:MultiComboBoxItem>option 3</u:MultiComboBoxItem>
|
<u:MultiComboBoxItem>option 3</u:MultiComboBoxItem>
|
||||||
|
<u:MultiComboBoxItem><Button>option 4</Button></u:MultiComboBoxItem>
|
||||||
|
<Button>option 5</Button>
|
||||||
</u:MultiComboBox>
|
</u:MultiComboBox>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</UserControl>
|
</UserControl>
|
||||||
|
|||||||
@@ -135,7 +135,14 @@
|
|||||||
Command="{TemplateBinding Command}"
|
Command="{TemplateBinding Command}"
|
||||||
CommandParameter="{TemplateBinding}"
|
CommandParameter="{TemplateBinding}"
|
||||||
Content="{StaticResource ClosableTagCloseIconGlyph}" />
|
Content="{StaticResource ClosableTagCloseIconGlyph}" />
|
||||||
|
<Border
|
||||||
|
IsVisible="{TemplateBinding VisualContent, Converter={x:Static ObjectConverters.IsNotNull}}"
|
||||||
|
Background="{TemplateBinding VisualContent}"
|
||||||
|
Width="{TemplateBinding VisualContentWidth}"
|
||||||
|
Height="{TemplateBinding VisualContentHeight}"
|
||||||
|
IsHitTestVisible="False" />
|
||||||
<ContentPresenter
|
<ContentPresenter
|
||||||
|
IsVisible="{TemplateBinding VisualContent, Converter={x:Static ObjectConverters.IsNull}}"
|
||||||
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
|
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
|
||||||
Content="{TemplateBinding Content}"
|
Content="{TemplateBinding Content}"
|
||||||
ContentTemplate="{TemplateBinding ContentTemplate}"
|
ContentTemplate="{TemplateBinding ContentTemplate}"
|
||||||
|
|||||||
@@ -187,6 +187,8 @@ public class MultiComboBox : SelectingItemsControl, IInnerContentControl, IPopup
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
container.DataContext = item;
|
||||||
|
|
||||||
base.PrepareContainerForItemOverride(container, item, index);
|
base.PrepareContainerForItemOverride(container, item, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,7 +215,7 @@ public class MultiComboBox : SelectingItemsControl, IInnerContentControl, IPopup
|
|||||||
{
|
{
|
||||||
if (o is StyledElement s)
|
if (o is StyledElement s)
|
||||||
{
|
{
|
||||||
var data = s.DataContext;
|
var data = s is ClosableTag { VisualContent: not null } c ? c.Content : s.DataContext;
|
||||||
SelectedItems?.Remove(data);
|
SelectedItems?.Remove(data);
|
||||||
var item = Items.FirstOrDefault(a => ReferenceEquals(a, data));
|
var item = Items.FirstOrDefault(a => ReferenceEquals(a, data));
|
||||||
if (item is not null)
|
if (item is not null)
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using Avalonia;
|
using Avalonia;
|
||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Layout;
|
||||||
|
using Avalonia.Media;
|
||||||
|
|
||||||
namespace Ursa.Controls;
|
namespace Ursa.Controls;
|
||||||
|
|
||||||
@@ -31,6 +33,15 @@ public class MultiComboBoxSelectedItemList: ItemsControl
|
|||||||
if (container is ClosableTag tag)
|
if (container is ClosableTag tag)
|
||||||
{
|
{
|
||||||
tag.Command = RemoveCommand;
|
tag.Command = RemoveCommand;
|
||||||
|
if (item is Layoutable visualContent)
|
||||||
|
{
|
||||||
|
tag.VisualContent = new VisualBrush
|
||||||
|
{
|
||||||
|
Visual = visualContent,
|
||||||
|
};
|
||||||
|
tag.VisualContentWidth = visualContent.Bounds.Width;
|
||||||
|
tag.VisualContentHeight = visualContent.Bounds.Height;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,7 @@ using System.Windows.Input;
|
|||||||
using Avalonia;
|
using Avalonia;
|
||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
using Avalonia.Controls.Metadata;
|
using Avalonia.Controls.Metadata;
|
||||||
|
using Avalonia.Media;
|
||||||
|
|
||||||
namespace Ursa.Controls;
|
namespace Ursa.Controls;
|
||||||
|
|
||||||
@@ -13,9 +14,36 @@ public class ClosableTag : ContentControl
|
|||||||
public static readonly StyledProperty<ICommand?> CommandProperty = AvaloniaProperty.Register<ClosableTag, ICommand?>(
|
public static readonly StyledProperty<ICommand?> CommandProperty = AvaloniaProperty.Register<ClosableTag, ICommand?>(
|
||||||
nameof(Command));
|
nameof(Command));
|
||||||
|
|
||||||
|
public static readonly StyledProperty<VisualBrush?> VisualContentProperty = AvaloniaProperty.Register<ClosableTag, VisualBrush?>(
|
||||||
|
nameof(VisualContent));
|
||||||
|
|
||||||
|
public static readonly StyledProperty<double?> VisualContentWidthProperty = AvaloniaProperty.Register<ClosableTag, double?>(
|
||||||
|
nameof(VisualContentWidth));
|
||||||
|
|
||||||
|
public static readonly StyledProperty<double?> VisualContentHeightProperty = AvaloniaProperty.Register<ClosableTag, double?>(
|
||||||
|
nameof(VisualContentHeight));
|
||||||
|
|
||||||
public ICommand? Command
|
public ICommand? Command
|
||||||
{
|
{
|
||||||
get => GetValue(CommandProperty);
|
get => GetValue(CommandProperty);
|
||||||
set => SetValue(CommandProperty, value);
|
set => SetValue(CommandProperty, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public VisualBrush? VisualContent
|
||||||
|
{
|
||||||
|
get => GetValue(VisualContentProperty);
|
||||||
|
set => SetValue(VisualContentProperty, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double? VisualContentWidth
|
||||||
|
{
|
||||||
|
get => GetValue(VisualContentWidthProperty);
|
||||||
|
set => SetValue(VisualContentWidthProperty, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double? VisualContentHeight
|
||||||
|
{
|
||||||
|
get => GetValue(VisualContentHeightProperty);
|
||||||
|
set => SetValue(VisualContentHeightProperty, value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user