uno icon indicating copy to clipboard operation
uno copied to clipboard

Twoway x:bind Doesn't Work Correctly On Different Platforms

Open NoobNotFound opened this issue 1 year ago • 4 comments

Current behavior

I've created a item template for a navigationview item with a model. I've set it to capture the selection state by adding a another navview item with two-way bindings like this

<NavigationView.MenuItemTemplate>
   <DataTemplate x:DataType="local:SquareNavigationViewItem">
        <NavigationViewItem
              Height="64"
              IsEnabled="{x:Bind IsEnabled, Mode=OneWay}"
              IsSelected="{x:Bind IsSelected, Mode=TwoWay}">
...

and it is used to hide the labels in navigationview item like this

  <TextBlock
       x:Load="{x:Bind IsSelected.Equals(x:False), Mode=OneWay}"
       Style="{StaticResource CaptionTextBlockStyle}"
       Text="{x:Bind Name}" />

As I've tested, this seems to work fine on Windows and Android platform. But It is messing around with MacOS, Skia (MacOS) and WASM. (Didn't build with IOS) Sometimes the label only gets hidden and shown once, which means the properties doesn't get properly binded after that (as I understand)

Expected behavior

The MacOS platforms should be same as the Windows and Android

How to reproduce it (as minimally and precisely as possible)

  • Create an Uno app through:
  • dotnet new install Uno.Templates
  • I've uploaded a demo project zi, you can use it or make your own.

UnoApp1.zip

Workaround

No response

Works on UWP/WinUI

Yes

Environment

Uno.WinUI / Uno.WinUI.WebAssembly / Uno.WinUI.Skia

NuGet package version(s)

  • CommunityToolkit.Mvvm : 8.3.2
  • "Uno.Sdk": "5.4.8"

Affected platforms

Mac Catalyst, Skia (macOS)

IDE

Visual Studio 2022, Visual Studio Code

IDE version

VS Version 17.12.0 Preview 1.0, VS Code Version: 1.95.0-insider

Relevant plugins

No response

Anything else we need to know?

Another thing I found, Even though this uses the same code It looks streched on some platforms (which is okay, I can manually make them)

  • WASM and WinUI (Bindings works fine only on WinUI)

image

  • Android With Debug Logs (Bindings works fine here)

Screenshot 2024-10-18 at 9 11 03 AM Screenshot 2024-10-18 at 9 17 50 AM
  • MacOS With Debug Logs

Screenshot 2024-10-18 at 9 13 58 AM Screenshot 2024-10-18 at 9 15 40 AM

Although this is my understanding, I'm not sure whether this is a problem with two-way binding or with controls or with mine, so correct me if I'm wrong

NoobNotFound avatar Oct 18 '24 03:10 NoobNotFound

Thanks for the report. Could you check using the latest 5.6-dev preview bits?

jeromelaban avatar Oct 18 '24 13:10 jeromelaban

Thanks for the report. Could you check using the latest 5.6-dev preview bits?

umm... You mean the SDKs? How can I upgrade? the SDKs to preview versions?

NoobNotFound avatar Oct 19 '24 07:10 NoobNotFound

Yes, there's only one version to update (https://www.nuget.org/packages/Uno.Sdk) then follow the directions for updating the uno.sdk in your project.

jeromelaban avatar Oct 19 '24 14:10 jeromelaban

@jeromelaban hi, with the following global.json the result was the same

{
  "msbuild-sdks": {
    "Uno.Sdk": "5.6.0-dev.24"
  },
  "sdk":{
    "allowPrerelease": true
  }
}

but... Upon further reviewing what I noticed is that two-way binding does seem to work correctly, but the issue is with unloading the textblock. If I made it to change the visibility, it would work.

<TextBlock x:Load="{x:Bind IsSelected.Equals(x:False), Mode=OneWay}"
...

Also It's not because of .Equals(x:False). I tested without it, the result was the same (except, it hides when it's doesn't need to hide...)

So Should I close this issue because it doesn't seems to be an issue with x:bind or just rename it?

NoobNotFound avatar Oct 19 '24 16:10 NoobNotFound

Thanks for the report. The issue here is specifically related to x:Load not to x:Bind specifically.

For the scenario at hand, you can use the following instead, which is less costly at runtime (x:Load recreates the element every time):

Visibility="{x:Bind IsSelected.Equals(x:False), Mode=OneWay}"

There's still an issue with unloading/reloading items with x:Load.

jeromelaban avatar Nov 26 '24 18:11 jeromelaban