unoplatform / uno

Open-source platform for building cross-platform native Mobile, Web, Desktop and Embedded apps quickly. Create rich, C#/XAML, single-codebase apps from any IDE. Hot Reload included! 90m+ NuGet Downloads!!
https://platform.uno
Apache License 2.0
8.89k stars 719 forks source link

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

Open NoobNotFound opened 6 days ago

NoobNotFound commented 6 days ago

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)

UnoApp1.zip

Workaround

No response

Works on UWP/WinUI

Yes

Environment

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

NuGet package version(s)

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)


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

jeromelaban commented 5 days ago

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

NoobNotFound commented 4 days ago

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?

jeromelaban commented 4 days ago

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.

NoobNotFound commented 4 days ago

@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?