From 7068d3ee705f97ce9a650ea84a86459bd46d34f3 Mon Sep 17 00:00:00 2001 From: Nathan Nguyen <146415969+NathanDrake2406@users.noreply.github.com> Date: Thu, 9 Apr 2026 20:17:07 +1000 Subject: [PATCH] Fix DataTransferItem returning wrong data for mismatched format (#21114) * fix: check format key in DataTransferItem.FindAccessor single-item path The single-item fast path in FindAccessor returned the stored value for any format query without checking if the requested format matched. This caused TryGetRaw to return wrong data when queried with a format different from the one stored (e.g., querying Bitmap on a text-only item returned the text value instead of null). Add the missing singleItem.Key.Equals(format) check, consistent with the dictionary path (TryGetValue) and RemoveCore. * chore: retrigger CI * chore: retrigger CI --------- Co-authored-by: Julien Lebosquain --- src/Avalonia.Base/Input/DataTransferItem.cs | 2 +- tests/Avalonia.Base.UnitTests/Input/DataFormatTests.cs | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Base/Input/DataTransferItem.cs b/src/Avalonia.Base/Input/DataTransferItem.cs index 1a54d5dab8..8a5a1cec5f 100644 --- a/src/Avalonia.Base/Input/DataTransferItem.cs +++ b/src/Avalonia.Base/Input/DataTransferItem.cs @@ -61,7 +61,7 @@ public sealed class DataTransferItem : IDataTransferItem, IAsyncDataTransferItem if (_accessorByFormat is not null) return _accessorByFormat.TryGetValue(format, out var accessor) ? accessor : null; - if (_singleItem is { } singleItem) + if (_singleItem is { } singleItem && singleItem.Key.Equals(format)) return singleItem.Value; return null; diff --git a/tests/Avalonia.Base.UnitTests/Input/DataFormatTests.cs b/tests/Avalonia.Base.UnitTests/Input/DataFormatTests.cs index e4eb52ecfc..5fde67f5a1 100644 --- a/tests/Avalonia.Base.UnitTests/Input/DataFormatTests.cs +++ b/tests/Avalonia.Base.UnitTests/Input/DataFormatTests.cs @@ -79,6 +79,16 @@ public sealed class DataFormatTests Assert.NotEqual(inProcess, application); } + [Fact] + public void TryGetRaw_With_Mismatched_Format_Returns_Null_For_Single_Format_Item() + { + var item = DataTransferItem.CreateText("hello"); + + var result = item.TryGetRaw(DataFormat.Bitmap); + + Assert.Null(result); + } + [Fact] public void InProcess_Format_Works_With_DataTransferItem_Set_And_Get() {