104: The one about XAML!

104: The one about XAML!

by Jonathan Dick, Allan Ritchie

Trending Podcast Topics, In Your Inbox

Sign up for Beacon’s free newsletter, and find out about the most interesting podcast topics before everyone else.

Rated 5 stars by early readers

By continuing, you are indicating that you accept our Terms of Service and Privacy Policy.

Topics in this Episode

About This Episode

70:28 minutes

published 23 days ago

American English

© 2024 Jonathan Dick, Allan Ritchie, Greg Shackles

Speaker 00s - 36.22s

You're listening to Gone Mobile PRODUCT, your input and output for all things.com. Maui ORG and mobile. Welcome back to another gun mobile.

Speaker 236.54s - 39.06s

Hey, Alan, what kind of coffee are you drinking today?

Speaker 440.24s - 43.22s

You know what kind of coffee I'm drinking. You call it my swill.

Speaker 243.6s - 44.08s

You call it.

Speaker 444.72s - 66.96s

I mean, that's my kind. I mean, John PERSON would have me buying a machine that measures the atomic weight of a hair and has some sort of shower thing that drips into it. And then it's got like this glass with like the leather is made from the same stuff they make Kobe beef. So I don't know.

Speaker 167.58s - 74.86s

Yeah. It's called chemics, right? Is that the, that's, that's, that's the particular one that I like

Speaker 474.86s - 79.8s

to use. Yeah. Okay. So it's a chemistry station is what it is. Yeah. I mean, it's, but you know what?

Speaker 279.8s - 88.34s

It's back to like the simple days of, of making coffee. It's just the basics, right Except it takes you. How long does it take you to make a cup of coffee, John PERSON?

Speaker 488.34s - 93.96s

It doesn't take that long. It's like 40 seconds to grind the beans and then the water's

Speaker 293.96s - 99.34s

heating up while that happens. And the beans also need a special grinder to you. You can't just

Speaker 499.34s - 104.58s

be a black and decker because you may just smash them with a hammer or something, right?

Speaker 2104.58s - 107.24s

Like you have a grinder, but you said it's, that's real too.

Speaker 4107.24s - 110.04s

You have a spice grinder and you don't have a coffee grinder.

Speaker 2110.4s - 111.18s

The ones with the blades?

Speaker 4111.18s - 121.4s

It says coffee grinder right on it, yes. Well, they, they lied to you. I'm sorry to tell you. Okay. Okay, so going back to how long it takes you, how long before you have a cup to mouth?

Speaker 2121.86s - 123.94s

Maybe five, six minutes, tops.

Speaker 4124.06s - 126.68s

No, you've told me over and over 15 minutes.

Speaker 2126.68s - 134.54s

No, no. But you know what? This actually reminds me. Did I ever tell you about the coffee scale that I was building? I think I did, right?

Speaker 4134.86s - 136.6s

Yes, I remember your IOT project.

Speaker 2136.8s - 140.54s

Yeah, yeah. We should do an episode on IOT.net stuff too.

Speaker 4141.1s - 142.7s

Is that going to, oh, that's a good idea.

Speaker 2143.1s - 160.6s

Is that going to measure the atomic weight of your coffee and water at the same time too? That's where I kind of ran into problems as I needed to find a better so, yeah, I mean, that was good content for another episode, right? Like talking about, I love the interaction of like the real world stuff with programming, but I had, I had to figure out a better way to

Speaker 3160.6s - 166.44s

do the scale part of it. The thing that I used was not accurate enough at all.

Speaker 4166.64s - 171.74s

I mean, you know, it was at least a couple hairs off. Yeah.

Speaker 2172.04s - 176.58s

I enjoy my coffee because it takes about 30 seconds to make it.

Speaker 0177.24s - 179.24s

And then it, you know, I add water.

Speaker 4179.32s - 192.72s

It tells me when I've done something stupid. It tells me when I need to clean it. I am a dumbass when it comes to coffee and I am all right because again, it's 30 seconds from cup to mouth. One day, maybe we'll fix that.

Speaker 2193.06s - 198.04s

We'll see. It's not going to be today. But speaking of other things that maybe one day we'll fix.

Speaker 4198.54s - 203.78s

Maybe, maybe. But at least we can talk about it, right? The wonderful world of Zammel ORG.

Speaker 2204.46s - 205.54s

The wonderful world. Now, I like Zammel ORG. I'm going to be? The wonderful world of Zammel. Ooh, Zammel.

Speaker 4206.1s - 207.92s

Now, I like Zammel ORG.

Speaker 2208.08s - 208.72s

I'm going to be honest.

Speaker 4208.84s - 210.1s

I am a Zammel ORG sympathizer.

Speaker 1210.7s - 213.58s

I think you either love it or you hate it as a person.

Speaker 2214.42s - 217.48s

I mean, I do a lot of React PRODUCT.

Speaker 1217.94s - 222.04s

I've done a lot of the in-code stuff, like from Community Toolkit PRODUCT and stuff.

Speaker 2222.16s - 222.68s

I love it.

Speaker 4223.08s - 224.74s

I love the Community Toolkit Code PRODUCT.

Speaker 2226.32s - 232.3s

I do love my React. I guess I'm just, I'm not picky. But Zammel ORG's very verbose.

Speaker 4232.76s - 236.9s

And some of the stuff I see in Zammel ORG, there's a customer I'm working with right now who I love.

Speaker 0236.9s - 241.24s

They're fantastic, but they have a love for Zammel ORG, like a deep love for Zammel.

Speaker 4241.94s - 248.92s

They like put everything in, you know, like do you, so do you, with your ZAML, do you put like, like, how serious are you?

Speaker 5248.92s - 253.84s

Do you put, like, all of your, like, you know, I see some people stick like the view model

Speaker 4253.84s - 256.74s

declaration in the binding context in the ZAML file, right?

Speaker 2256.78s - 259.58s

Like, so that's all markup, which you can totally do.

Speaker 4260.52s - 262.24s

But then you probably don't because then.

Speaker 2262.62s - 266s

Yeah. Don't do that. I don't. I'm just saying. I've seen it. It, it, they don't,. Don't do that. I don't. I'm just saying. I've seen it.

Speaker 4267.64s - 272.88s

They don't do that. Thankfully, they are on the, the DIY bus for their view models and stuff.

Speaker 5274.08s - 277.88s

But they have a love for, you know, everything being in Zammel ORG.

Speaker 4278.18s - 289.8s

And I'm like, my dudes, we've got to get to the view models, man. Do you know why? Because they're very easy to unit test. And these guys love their code coverage, like in other projects on their server side.

Speaker 0289.92s - 293.4s

They love their, you know,

Speaker 4293.5s - 302.82s

all those metrics coming in and they love being able to test it right there. But the more you get into the ZAML with stuff like converters, right?

Speaker 0302.82s - 304.08s

The more you get over there,

Speaker 3304.74s - 306s

the more kind of, I don't want you get over there, the more kind of,

Speaker 0306s - 307.1s

I don't want to call it spaghetti,

Speaker 4307.1s - 313.44s

but certainly separated code bits. And it goes more over to the UI, right?

Speaker 1313.58s - 313.78s

Yeah.

Speaker 4314.22s - 317.16s

And really, it's like, do as much as you can in that view model.

Speaker 2317.74s - 319.06s

Well, yeah, and that's,

Speaker 4319.74s - 329.64s

well, that's, I mean, if you're talking to maybe some, you know, purest in how you're separating your concerns of things there, right?

Speaker 2329.64s - 365.5s

Like, that's something that I feel like I've seen so many people over the years be like, wow, you shouldn't, you shouldn't put that in the view model because that's like the place that, you know, is more your, your pristine business logic that shouldn't have anything to do about how the view is constructed. And it's like, yeah. But at the end of the day, if you're choosing sometimes between, I need to get this thing into my, my, my, my, Amel ORG and either I have to write yet another converter, or I just like, add one more property that maybe just even as a read only wrapper around something else. Like, I don't know.

Speaker 4368.36s - 369.08s

How many converters on average do you have?

Speaker 2373.46s - 378.28s

So, just a, just the, I mean, on average, average is hard because I don't really have many apps, right? I have one app, so I have, my average is skewed by the one app.

Speaker 0378.46s - 395.22s

I have a lot of converters in it. I don't know if I've counted them. No, no, no, no, but, but, but, but this is because I carried a lot of legacy stuff over from my early days of building this app where, you know, it was like, oh, yeah, you're supposed to write converters to do this.

Speaker 3395.22s - 402.76s

You shouldn't, you know, add a property that inverts the, the Boolean property on your view model because that's not the right way to do it.

Speaker 2402.78s - 404.12s

That's not the pure way to do it.

Speaker 3405.12s - 410.4s

So I have some of that kind of stuff. And I have some interesting ones. I think I mentioned the

Speaker 2410.4s - 424.28s

one to you where I've got, this might be over engineered. I'll be willing to wager that. But I have a, because I'm doing Blazer Web, right, Wazam, and I'm doing Maui ORG, I have a

Speaker 4424.28s - 426.54s

formatted. So Maui ORG has the concept of a

Speaker 0426.54s - 433.08s

formatted string. I think it's formatted string, right? That's the name. Yes. Okay. Because I'll

Speaker 4433.08s - 439.84s

get to this in a second. Anyway, the formatted string is basically a way for you to have a bunch of text

Speaker 2439.84s - 446.74s

in a label without having a bunch of labels. So like in my pool app, I have, like in my log timeline,

Speaker 1446.74s - 456.18s

one of my logs is like, oh, you added X amount of Y chemical, you know, at Z strength to your pool.

Speaker 2456.94s - 485.98s

And so I want to, I have all that information. I want to display that. And I want to have like the chemical amount to be like maybe slightly bolder and maybe a different color than the chemical type because the chemical types I try and group by kind of like what they impact like what measure of the pool chemistry they impact so all of the ones that impact like the chlorine levels are a certain color. And then I have the amount.

Speaker 4486.42s - 489.9s

I have the amount. I don't know. There's a there's another piece there. There's a whole

Speaker 2489.9s - 606.34s

bunch of bound properties that you have. Right. So like I could do those all in individual properties on the view model. And I could have three or four different labels to in a layout to set that all up or or I can have one label, right? And all of the platforms have some concept of this kind of label that has like, you know, spans of text that are different styles and stuff. So Android does this, Windows PRODUCT does this, iOS does this. And so it's more performant to do one label like that than to have a bunch ofMaui ORG labels that create, you know, more instances of the native control to back them and do all that. So I think there's a good reason for me to use the format stream and for others to do so as well. So coming back to the whole converter thing, to make that all abstracted across like Web and Maui, I introduced a new thing called, that I call formatted text, which is why I always confuse the name with formatted string, because I'm like, which one is the native one? And so formatted text, like, takes theconcept of what's the font size, the color, the font itself. And then it gets even more crazy when you start introducing, like I have a lot of font icons and I'll mix those in with those into the labels too, right? So I might have like a font icon and I use a symbol character to show like, I don't know, the some, well, actually I do this for weather conditions. So I'll do one label and I'll have like a cloud if it's cloudy or a sun if it's sunny or rains if it's, you know, rain drop if it's rainy.And I'll mix that in with like the temperature value and the wind speed and all the different stuff there. So multiple fonts and stuff. So I extracted that all out. And then at the end of it all, I have a converter that takes a formatted text object and converts it into a formatted string.

Speaker 4607.48s - 611.96s

I think that's an okay use of it. You're definitely going to have the purists throwing spears at you.

Speaker 2612.12s - 613.02s

Yeah, who cares.

Speaker 1614.6s - 616.84s

Well, that's the other thing. Do what works for you.

Speaker 4617.08s - 619.72s

Right. And it works for me in both places, right?

Speaker 2619.72s - 623.5s

Like, on the Blazer PRODUCT side, it actually worked out well. I'm like, oh, I got this thing.

Speaker 4623.56s - 628.04s

I just turn it into whatever, you know, HTML or whatever things I need to do there.

Speaker 2628.1s - 629.94s

And it all just comes together. It's lovely.

Speaker 4630.4s - 632.82s

And it renders, hey, if it works, it works.

Speaker 2632.98s - 633.2s

Yep.

Speaker 4634.24s - 650.44s

But let's be fair. You can go nuts with converters. So I've seen projects with many converters, many, many. Like, I want to say, the worst I've seen is like 40.

Speaker 2658.14s - 667.12s

I probably have more than that. Oh, dear. But again, like I could probably do an audit and get rid of half of them and live life happily. I get by with two. And the only reason I have two is for easy reasons. One is

Speaker 4667.12s - 672.8s

inverse of bullying. Everybody has that. I wish it was built into Zammel ORG. I could do it with

Speaker 2672.8s - 678.04s

data triggers and all that stuff, but it gets kind of. Community Toolkit PRODUCT ships a bunch of those now

Speaker 4678.04s - 682.9s

too, right? Yeah, but everybody, I think everybody and their uncle has an inverse bull or calls it

Speaker 2682.9s - 685.84s

like knots or something, right?

Speaker 4688.82s - 689s

But yes, it's out of the box in community toolkit.

Speaker 2691.64s - 693.04s

Thank God PERSON because I think just about everybody uses it. Talking about a lot of converters.

Speaker 4693.26s - 693.72s

They have a lot.

Speaker 2693.8s - 696.04s

They have probably 40 converters in there now too.

Speaker 4697.4s - 699.68s

Well, whatever you love, I guess.

Speaker 2700.38s - 704.34s

I'm going to say, though, that I have seen a lot of business logic leak into them.

Speaker 3704.84s - 709.48s

I've seen a lot of like, I mean, so going back to the two I have.

Speaker 4709.54s - 710.34s

I have the inverse.

Speaker 2710.56s - 711.74s

Obviously, everybody has that.

Speaker 3711.82s - 712.9s

Can I guess the other one?

Speaker 2713.28s - 714.42s

Oh, I was going to guess it.

Speaker 1714.42s - 722.54s

I know that's the actual answer, but I was going to suggest that are you really just, you have one converter and one of your converter

Speaker 4722.54s - 740.38s

is like, what's the type of converter converter and then you just have a mega converter it's a double to like an numeric right so i can check the target not a big deal it's just because double doesn't come out of the box and binding for maui or zamerin forms so i've had it for a long time it's a very

Speaker 1740.38s - 745.74s

nullible uh numbers are can be a pain too with uh out of the box i have some of those right nullable numbers can be a pain too with out of the box.

Speaker 4745.92s - 749.34s

I have some of those, right, nullable double converter.

Speaker 2749.96s - 751.88s

I think there's other ways I deal with that, though.

Speaker 4752.26s - 755.14s

I don't usually tend to bind nullable I'm able to tell.

Speaker 2755.48s - 757.14s

Like dates, fine, you could say dates.

Speaker 4757.24s - 758.82s

There's some weird stuff you've got to do there.

Speaker 2759.86s - 765.2s

There's cases right now where I do date only or time only, which I wish came out of the box,

Speaker 4765.2s - 766.12s

but it doesn't.

Speaker 2766.3s - 767.08s

It's still minor.

Speaker 4768.34s - 773.64s

Usually in the view model, I can end up flipping those over to, you know, just to my,

Speaker 1773.72s - 776.1s

my DTO's manual anyway.

Speaker 4776.18s - 776.9s

So not a big deal.

Speaker 5778.7s - 779.68s

It is what it is.

Speaker 4779.68s - 785.46s

But like I said, I've seen places where a lot of business logic begins to leak in these, like this specific

Speaker 1785.46s - 792.06s

enum to this specific value, right? Yeah. And that doesn't work because enums grow, right? So you

Speaker 4792.06s - 807.48s

don't really want to start mixing too much of that stuff. Um, what's another good one? Well, like you said, nulls to just about everything. Enums to just about everything. I have had a case and I don't remember

Speaker 2807.48s - 823s

the specifics. I know I've done like something like Boole to grid length or something like that. That's weird. Well, no, but there was a there was a good case for it where I think if I,

Speaker 3823.5s - 831.76s

well, it was visibility, but if I didn't do it that way, my layout became, you know, enormously more complex or nested. So I was like, I really do want to

Speaker 2831.76s - 836.96s

use a grid. And I just want to hide, you know, some columns so they collapse or some rows so they

Speaker 4836.96s - 843.16s

collapse. Um, so yeah. Now for some of these things, you could do data triggers. The problem with,

Speaker 3843.16s - 849.08s

the problem with those is that you'll develop carpal tunnel syndrome really quick having to do those.

Speaker 2849.58s - 850.9s

It's a very verbose.

Speaker 4851.44s - 853.02s

It's a lot of flip and typing.

Speaker 5853.84s - 859.46s

And they don't always reset the same way, right? You have to have all of the stuff you change reset back.

Speaker 4860.48s - 864.64s

And a lot of people don't realize that, right? It doesn't just kind of return.

Speaker 5864.9s - 871.72s

Yeah, yeah. So you end up with, you end up mapping both sides of the equation fully. And a lot of people don't realize that, right? It doesn't just kind of return. Yeah, yeah. So you end up with, you end up mapping both sides of the equation fully to do the things you want to do.

Speaker 4871.94s - 886.66s

And it's a lot of typing. It's huge. Now, the other thing I tend to see people use is, and I don't use these at all, so maybe I'm stupid. But I don't use like XAML extensions at all. Like they're just, at all. Like they're just at all.

Speaker 2887.02s - 889.56s

Like to give me an example of ones that you see?

Speaker 4890.56s - 891.88s

Localization is the biggest one.

Speaker 2892.2s - 898.62s

Now people do localization different. I am hardcore that belongs in the view model because a lot of stuff,

Speaker 4898.68s - 902.56s

a lot of the messages you're going to format a lot of the validation, is going to come out of your view model, right?

Speaker 3903.66s - 908.54s

So I'm not big on that being separate for the case of the page because my view model

Speaker 4908.54s - 916.5s

is going to have to deal with it anyways. So what I've been doing is notoriously binding against the dictionary, right? So dictionary strings.

Speaker 3916.88s - 923.28s

And you can go binding, brace bracket, the value, close brace bracket, and it binds.

Speaker 4923.52s - 935.6s

And that's it. And then you can, if it's in the dictionary, there brace bracket, and it binds. And that's it. And it works beautiful. And then you can, if it's, if it's in the dictionary, there you go, right? It just, it's out of the box. It's very easy. I don't need an extension. It's just a normal binding.Yeah.

Speaker 2935.72s - 947.96s

Well, and I think what was, I haven't looked at it, the code in a while, but like you, you built into shiny the localization, the source generator thing. Is that, are you like shipping that as a thing yet?

Speaker 4948.04s - 958.98s

Like I know it's on Nuget as a preview because I'm using it because you built it for me because you're nice. And see, I do use other people stuff sometimes. Well, it was, but to be fair, it's because you wanted the strongly typed keys,

Speaker 2958.98s - 960.96s

but with the dependency injected values.

Speaker 5961.16s - 965.42s

Now, I dependency inject my localization, not because I believe that it needs to be

Speaker 4965.42s - 972.24s

separated, but I've had two massive projects where we had a multi-tenanted setup and the customer,

Speaker 3973.12s - 977s

you know, if they're paying a million bucks, man, you're pretty much going to do whatever they ask,

Speaker 4977.04s - 996.3s

right? Yeah. So we had certain tenants that wanted certain wording for certain fields. So, you know, shipping the out-of-the-box resource files didn't work for them. So we had to get rich, right? And then localizations would kind of come in over time. And you had Quebec French that didn't match France GPE-French because apparently Quebec French

Speaker 0996.3s - 1002.68s

is fake, which I'm not surprised, right? So controversy. Don't shoot by I'm Canadian NORP.

Speaker 21002.68s - 1009.18s

No, it's funny because, like, you know, we obviously grew up learning Quebec GPE French in school.

Speaker 41009.48s - 1012.3s

I mean, I'm assuming that they taught you French LANGUAGE, too.

Speaker 21012.54s - 1014.12s

We're not that far different in age.

Speaker 01014.54s - 1014.82s

Right.

Speaker 41015.98s - 1018.76s

And, you know, then you would know a little bit.

Speaker 11018.82s - 1027.22s

And, like, I just remember going to France a handful of times and, like, anything you tried to speak They're like, one, I know you're not French LANGUAGE at all.

Speaker 01027.64s - 1030.92s

Two, I know you're trying to speak French LANGUAGE, but it's like Canada French.

Speaker 11030.98s - 1031.76s

It's Quebec French LANGUAGE.

Speaker 21031.88s - 1039.1s

And then the opposite, right? You go to Quebec and they're like, you know, if you didn't speak the Quebec French LANGUAGE, well, get out of here.

Speaker 41039.12s - 1044.88s

They know. Yeah. So, but as Canadians NORP, we're very accustomed to having to do localization.

Speaker 21045.06s - 1045.3s

Right. Right. So you had to have, we're very accustomed to having to do localization. Right.

Speaker 41045.62s - 1055.72s

Right. So, so you had to have strongly typed keys, which I get, you know, it's got to be that way. But you still had to have the dependency injection just in case. Yep.

Speaker 11056.72s - 1059.36s

So a lot of people using extensions for that.

Speaker 41059.36s - 1071.78s

I hate it because it takes away again from my view model and my view model is going to use those keys anyways. So I wish people would stop doing it. Yeah. No, I, pick what works. I really like the,

Speaker 21071.78s - 1076.6s

the way that it's set up with the source generator and stuff. I think that's a nice thing. And

Speaker 41076.6s - 1081.3s

like localization is just hard, you know, no matter what. So it's, I guess I'm so used to it now.

Speaker 21081.4s - 1085.78s

It doesn't, it doesn't really phase me anymore. It's just a lot of extra copying and pasting.

Speaker 41086.32s - 1090.9s

Well, but even like, I mean, like maybe this another another episode idea, localization.

Speaker 21091.1s - 1094.5s

Like we could do, I remember back in the Zamoran NORP days, this being a thing.

Speaker 41094.5s - 1133.02s

And there was, there was a tool at one point that you could go, that would go in like, find any strings that you used in the source code, extract that out, make that like the localization, you know, resource dictionary, whatever you want to call it. And then you'd go get translations and it knew how to like inject those back in and stuff. Right. But there was, like, even resource files, I believe there's still cases that that doesn't really fully solve. So, yeah, there's probably room for doing more interesting things there with your source generator and again, not using extensions. I wonder if AI has improved localization.

Speaker 21133.16s - 1145.36s

Maybe. Well, yeah, it's a whole other thing too, right? It's like, oh, I'm just going to go like use Google Translays PRODUCT. Like, yeah, that might not be the best idea if you don't have anybody who knows, like, how to look, verify the results.

Speaker 41145.9s - 1150.9s

You know, I did that in the past, and then I handed those translations off to somebody that

Speaker 21150.9s - 1156.62s

was, like, full French here in Canada GPE. And they were like, what is this? Now, this is going back

Speaker 41156.62s - 1161.16s

literally 20 years ago. Yeah. Okay. So I'm pretty sure that things have come a lot further.

Speaker 31161.88s - 1165.4s

Probably. But that's how I did it. I translated and they were like, what is this?

Speaker 21165.4s - 1166.32s

That's an interesting idea.

Speaker 31166.44s - 1167.7s

Because like, yeah, you could almost,

Speaker 21167.82s - 1170.96s

I feel like if you could give co-pilot or whatever GPT,

Speaker 41171.2s - 1172.38s

whatever model you're using,

Speaker 21173.08s - 1174.54s

like a,

Speaker 41174.92s - 1175.2s

you know,

Speaker 21175.26s - 1177.42s

give them your strings to translate,

Speaker 41177.52s - 1179.8s

but then give it like a blurb of context, right?

Speaker 21180.32s - 1181.78s

It's probably going to do an okay job.

Speaker 01183.02s - 1183.98s

Even if you said like,

Speaker 31183.98s - 1194.4s

hey, this is, you know, this entry is for a button in an app that talks about doing this, like, you know, and then they would be able to translate it to another language with that context.

Speaker 01195.02s - 1195.78s

There we go.

Speaker 21196.4s - 1196.96s

It's an idea.

Speaker 41197.64s - 1200.84s

I bet you they tell you not to use a ZAML extension to do it, though.

Speaker 21201.26s - 1202.32s

I bet you're right.

Speaker 41202.88s - 1206.76s

Copilot probably is like, here you go, but just whatever you do,

Speaker 21207.42s - 1211.28s

don't you dare use that ZAML extension? There you go. See, that's all I'm saying.

Speaker 41211.88s - 1218.5s

It's it. Less samolization, more view modeling. Yeah. Well, and so back to the whole converter thing.

Speaker 21218.5s - 1223.76s

Okay, so you have two converters. There is some, there's going to be people on both sides of the camp, right?

Speaker 41223.76s - 1229.16s

There is some, there's going to be people on both sides of the camp, right? Of like, do more in the, in the view area, do more in the view model area because it's, it's simpler.

Speaker 21229.16s - 1298.36s

And, you know, it just, it's not that big of a deal. Like, you can still write a view model that leaks through some of the kind of the, kind of UI-oriented aspect of it that's not going to like be the end of the day, end of the world, end of the whole end of your life, right? Like, it's fine. However, talking about converters, like, it would be nice if they were easier to actually use or if,like, we could do more of that in Zam. All right? That's one of the things I love about, uh, the idea of like razor and stuff is that you can do some of those types of like mutations in your view code and it's not really heavy, right? Like if I can, if I'm just like saying, oh, I have this string, you know, and I want to like, or maybe a better case is like I have some currency value or something, right? And I want to format it as such.I know we can do that with the built in string stuff, but like let's pretend you couldn't. That would be a nice case to be able to just, like, have a way to write a little bit of C-sharp code that, like, did the thing that you wanted to do to that property from the view model, but you didn't have to use a converter. You didn't have to use another property on your view model.

Speaker 41298.76s - 1325.58s

And, like, that's something that doing Blazer, like the WASM stuff in my app was really felt really freeing. It's like, oh, I can do that kind of stuff here. It's easy. So. And you got away with it. It works. And that's really what it matters at the end of the day. It works. So as much as I say, don't do these things, right? It's only experience. Yeah. I've worked with a lot of apps and I've seen these things go more wrong than right.

Speaker 51330.22s - 1335.66s

So you're in the camp of like to do something like that, no, I'd still rather do it in the view model so that like I can maybe test that the actual string coming out is correct or something

Speaker 41335.66s - 1341.36s

like that. Now I know how to avoid getting that data points mixed up, right? So when we're

Speaker 21341.36s - 1345.62s

talking about converters, so one where converters tend to work,

Speaker 51350.76s - 1351.66s

but I still don't need to use them as I convert other ways is something like a map.

Speaker 41357.14s - 1357.54s

Right. So when you put a pin on a map, it's obviously a collection of two doubles, right?

Speaker 21361.3s - 1361.86s

And if you're probably going to pass it, like if I'm putting a pin on it, for instance,

Speaker 41366.54s - 1366.62s

I'm probably going to put some sort of piece of data on that, like a description or an image, right?

Speaker 21366.78s - 1367.22s

Yep.

Speaker 41372.16s - 1374.02s

So I can define that in my view model as a record and say, this is the four points of data that I want to create for a pin.

Speaker 31374.4s - 1376.2s

That pin's not UI based.

Speaker 41376.3s - 1377.3s

It's still data based.

Speaker 51378.54s - 1378.88s

Right?

Speaker 41378.92s - 1393.76s

So I can ship it over and say, when I ship this over to my view model, I can have my code behind, decide, oh, right. Okay, you're telling me there's a new pin. It's going to go and put the pin on the map, and it's going to do it in the UI, right? So it's going to find the name named reference

Speaker 31393.76s - 1395.7s

to my Google ORG map or whatever,

Speaker 41396.18s - 1406.38s

and it's going to translate that type that the view model just kind of signaled, and then it's going to put it on the map. But I didn't have a UI type leak across, right?

Speaker 31406.38s - 1407.38s

I just kind of transferred it.

Speaker 41407.38s - 1415.06s

Yeah. Could I have done it with a converter? Yeah, probably, but definitely not as easy.

Speaker 21415.06s - 1422.52s

Do you want, depending what the source of data looks like too, right? Like where is that coming from, I guess? Like did you create a, yeah, you created a new.

Speaker 41422.52s - 1424.28s

Observable.

Speaker 21424.28s - 1432.7s

Yeah, I just mean in terms of like, what, like, is the observable giving you a more complex data object, you know, like, so I'm

Speaker 41432.7s - 1443.26s

admitting it. So you're kind of reducing it down to a more simple data type in that sense. Exactly. Yeah. And it's still unit, it's still unit testable because I don't need to emerge. Yep.

Speaker 21443.32s - 1458.52s

The UI types, which that's a big deal. And that's kind of, you know, if I'm going to try and be unbiased here, like that is one potential advantage of type converters is they are unit testable.

Speaker 41459.06s - 1477.66s

Yes. Yeah, you beat me to it. I was about to say you can unit test a type converter. There's nothing wrong with doing it, but you again, you're at, you're kind of blur in the lines, right? I mean, these days, if you're going to go that far, you may as well go all the way in terms of like writing an automated

Speaker 31477.66s - 1482.88s

test. Right? So the unit test will get you some of your metrics on the view models so all the

Speaker 41482.88s - 1490.26s

companies can check their box. Right. We got our unit test coverage that we wanted and now we're running the automated tests

Speaker 31490.26s - 1499.28s

so there's a bit of a line right um i have always managed to get by with my two converters and avoiding

Speaker 41499.28s - 1505.04s

other converters and extensions i never use never never have i used I used to zamil extension. Am I stupid?

Speaker 21506.04s - 1509.4s

No, I mean, I, I looked at them.

Speaker 41509.56s - 1514.8s

So one of the things, like, we talked about this quite a while ago now, actually, I think.

Speaker 11515.7s - 1522.28s

Just the idea of like, hey, what are some things that would make Sammel ORG nicer, right?

Speaker 41522.68s - 1527.44s

Like in some of the same veins of these conversations, of these points that we're talking about.

Speaker 21528.74s - 1562.04s

So markup extensions, like that gives you, you know, a way to maybe do some interesting things with it. And I had started kind of even looking at, you know, are there, is there a way I can use markup extensions to do something that's a little bit easier for doing some of like the conversion stuff,like type converter stuff. And I didn't get too far with it. I think I ran into some problems for the exact scenario that I wanted to do. But I mean, there's some maybe interesting ones out there. I'm struggling to think of like where I might use any of them today, though.

Speaker 41562.58s - 1573.28s

Now looking at C sharp markup, they. Now, looking at C-sharp markup, there actually, from what I've dealt with, there really isn't a need for type converters at all because you can do a lot of that cool casting stuff,

Speaker 31573.82s - 1575.24s

and it just works, right?

Speaker 41575.64s - 1582.9s

Like type converters are more to deal with the Zammel lack of context, I guess, for the best.

Speaker 11583.64s - 1584.78s

I mean, correct me if I'm wrong,

Speaker 41584.84s - 1590.7s

but that's the way I've seen it is that that C sharp markup, you just don't need it. You don't need the type converters. It's just, it's implicit.

Speaker 21591.12s - 1591.6s

Yeah, exactly.

Speaker 41591.7s - 1607.74s

Well, that's kind of, that's what I'm saying, kind of like with, uh, with doing like the razor stuff too, right? Like in the sense, you're kind of just writing code in line where you need it to do something that you would maybe use a converter to do. Right. And in a blazer and HTML, everything's a string at the end of the days.

Speaker 11607.94s - 1609.18s

At the end of the day anyways, right?

Speaker 41609.3s - 1619.88s

So it's more or less the same stuff, right? Now, what's the other thing in terms of Zammel ORG stuff? Behaviors. That was the one I was looking for.

Speaker 11620.12s - 1620.38s

Okay.

Speaker 41620.76s - 1631.2s

Behaviors I have used. I haven't really had to port too many over because I find I can just do it in handlers easier now. Okay.

Speaker 11631.66s - 1636.76s

For certain things like, like, uh, so are you like mapping, like doing your own

Speaker 41636.76s - 1642.54s

mapper stuff on existing handlers to kind of get at, you know, changing things on the

Speaker 21642.54s - 1647.74s

native level? Like that's, is that what you were using, you know, you would maybe have used a behavior for? Yeah.

Speaker 41647.9s - 1651.78s

So something like, um, focused was a big one.

Speaker 21652.12s - 1656.84s

So there was like, you wanted to know when a text, like an entry.

Speaker 01657.04s - 1661.78s

So I just did one of these recently. And I'm pretty sure it was fully handler. You know, I'm old.

Speaker 41661.82s - 1674.22s

I forget. Anyhow, what it was in the original, it was a behavior. When the focused event fired, right? So I bound the behavior to the entry. When the focus event was fired, I bound a property to say his focus true.

Speaker 51675.02s - 1677.2s

And vice versa for when it wasn't focused.

Speaker 41677.3s - 1696.24s

So that's not, because it's an event, it's not something that's easily bindable. You could do one of those event binding things, blah, blah, blah, blah, but for this part, a behavior was easy. It did the focus. It did exactly what it needed to. And that way I could do things like change the border color, right? Or, I don't know, whatever you want to do.

Speaker 21696.76s - 1702.7s

Whatever you want to do, because focus is achieved. Yeah. I look at some of the behaviors that I have

Speaker 11702.7s - 1706.46s

in my app too now, just to kind of familiarize myself with them again.

Speaker 41707.1s - 1708.22s

And I have a few.

Speaker 11708.28s - 1708.84s

I don't have many,

Speaker 41708.94s - 1714.34s

but like it is a nice way to kind of get at the native controls in a pretty simple manner.

Speaker 11714.34s - 1718.84s

Like one of the things that with the handlers,

Speaker 21719.04s - 1740.16s

like, yeah, it's much easier than renderers were back in the day. Like you can, you can basically, you know, update the mappers, the property mappers or whatever, and have your own thing run andyou get access to the instance of like the platform control and then you can do your stuff there. I never remember like offhand how to like do that pattern correctly.

Speaker 41740.16s - 1746.32s

And so I'm weird one too. It's a little bit weird. And even though like I'm fine with

Speaker 21746.32s - 1777.82s

making my own handlers completely for things like that I'm like exposing controls. There are like new things. But yeah, when I go to like alter an existing one, I always kind of forget how to do it. And honestly, behaviors are the thing I like about them from a Maui ORG perspective. So like with the behavior, you get the, the attack on attached to method that you override, right? So that's like when your behavior is going to actually be attached to the control instance. And at that point, you can, you can do a bunch of different things.

Speaker 41778.3s - 1788.16s

And one of the things, whatever you want at that point. Basically whatever you want. But then like one of the other things that you do offer, I find myself doing often is when, just because like you're attached to the control doesn't mean

Speaker 21788.16s - 1806.58s

things are all like set up and you're able to access it properly either, depending on the platform especially. And so I end up like subscribing to the loaded event for the, the view. And then I know once that loaded event has fired and I unsubscribe to you and clean up after myself because, you know, I'm good. After that's fired, then I know once that loaded event has fired, and I unsubscribe to you, I clean up after myself because, you know, I'm good.

Speaker 31807.38s - 1827.26s

After that's fired, then I know, like, things are set up and I can start, you know, altering that native control where sometimes you can't until that event has happened, especially I think Windows PRODUCT was particularly bad about that. If the control wasn't loaded yet and you tried to, like, do something to it, it might just crack. Like, you might get an exception, right? So.

Speaker 41827.86s - 1835.46s

Windows. Yeah. So I have a few. I do ones like, um, like on Android PRODUCT. I, so on my pool app,

Speaker 21835.46s - 1852s

I've totally created like my own, um, Frankenstein control, right? And so I do things like remove the outline from the controls on all the platforms because I kind of draw my own Chrome PRODUCT around it. That's what everybody does, though. That's fair.

Speaker 41852s - 1859.4s

Yeah. Yeah. I mean, obviously it not being consistent in how that looks across platforms to start

Speaker 21859.4s - 1880.08s

is usually a catalyst for wanting to do that. In my case, it's, it's, you know, that plus some other stuff, too. So I end up doing stuff like that. You're going to like this one. I have one that I call the round the corners behavior. And it's literally named that because I don't know, why not? It's just a border, right?

Speaker 41880.42s - 1881.52s

Well, it's not.

Speaker 21881.52s - 1907.74s

It's, it's letting me compress the control hierarchy so they don't have to put a border around a thing. So if I have a grid, I don't want to put a border around it because that's two control instances I have to deal with now. So I, I. John PERSON didn't pass my metric. The first question I always ask is, do you have a performance problem? I did, though. I did. Oh, you did not on a control.

Speaker 41908.32s - 1909.16s

Did you really?

Speaker 21909.6s - 1913.64s

Or was it like 30 nanoseconds and you were like, this has to be optimized?

Speaker 41914s - 1914.14s

Okay.

Speaker 21914.94s - 1916.44s

There's two parts to this.

Speaker 11916.6s - 1924.06s

I did in earlier Maui days when performance wasn't as great.

Speaker 21924.06s - 1927.84s

Like in the net six days, bleeding into the early net seven days.

Speaker 31928.8s - 1932.68s

There were times on Android PRODUCT, especially where, like, loading a page that had a whole

Speaker 21932.68s - 1936.76s

bunch of controls on it took a long time, like not acceptable.

Speaker 41937.64s - 1939.48s

How many controls are we talking about?

Speaker 21940.76s - 1942.18s

Just eyeball it.

Speaker 41942.22s - 1942.84s

Just eyeball it.

Speaker 21942.84s - 1944.96s

Yeah, I'm going to, I'm opening the app and I want to see.

Speaker 41945.16s - 1950.84s

It's got to be, it's got to be like 30 different controls at least.

Speaker 21951.64s - 1953.48s

And you were having a...

Speaker 41953.48s - 1955.46s

In early days, that's what I'm saying.

Speaker 21955.56s - 1959.4s

Like, we've obviously made things better because it's not that bad anymore.

Speaker 41959.6s - 1965.44s

But it used to be not great for some of those things. I can't even find my app anymore. There it is.

Speaker 21966.18s - 1985.62s

Yeah, like in the pool settings page, I've got one, two, three, four, five, six, seven, eight, nine, ten, eleven, fifteen, eighteen, ten, eleven, fifteen, eight, ten, twenty. Yeah, probably about 30 different, like, entry fields. And, um, and that's, this isn't just like, I'm not counting like every image or anything. Like, there's those as well on, on many of those. So, like, there's like 30 entries and text, or check, um, and that's, um, and that's this isn't just like I'm not counting like every image or anything like there's

Speaker 31985.62s - 1990.54s

those as well on on many of those so like there's like 30 entries and text or checkboxes and

Speaker 11990.54s - 1997.88s

stuff like that so it's it was a lot anyway anyway I mean I've seen a lot more controls on a page

Speaker 41997.88s - 2032.14s

with her in Maui in Maui it's probably if I did it again today I wouldn't feel the same but now that I'm like, you know, have that optimization and it works for me and I like it, I'm going to keep it. So yeah, I can basically assign this behavior to like a grid or, you know, a vertical stack layout or whatever. And it alters the platform specific control to put like a nice border around it with a corner radius and a background color and clips it and all that. It's very nice. All right. I'm just nodding at John

Speaker 12032.14s - 2036.46s

right now in agree. It's not really agreeing. But whatever works. It's one of those like he works. He

Speaker 42036.46s - 2042.06s

knows it. He knows it. But that's all right. It's all right. It still works. It still works.

Speaker 22042.06s - 2046.12s

It works. Again, at the end of the day, if it works, that's great.

Speaker 12046.86s - 2049.54s

Would I do that in a traditional app right now?

Speaker 42049.54s - 2056.7s

If you had an app for a customer where the app is 100 plus screens, probably not.

Speaker 22057.3s - 2057.94s

Probably not.

Speaker 42058.56s - 2060.08s

Probably got bigger fish to fry.

Speaker 22060.2s - 2060.86s

But that's all right.

Speaker 42061.06s - 2063.48s

It works for John PERSON and pool of math is working well.

Speaker 32063.74s - 2064.52s

So there you go.

Speaker 42064.56s - 2064.8s

That's right.

Speaker 22071.5s - 2072.38s

But do you have unit test, John PERSON? I do. Do you? What? Yeah. No.

Speaker 42077.68s - 2078.94s

I know you have D.I. in that thing because you bought into that a while ago. Yeah. I have.

Speaker 22087.72s - 2091.5s

So to be to be fair, okay, so my unit tests are largely around the actual calculations in math for like the pool chemistry stuff. So like that maybe you don't even count because that's more the

Speaker 42091.5s - 2099.5s

like I'm testing, you know, given the inputs, does the output match like the calculation I want?

Speaker 22099.62s - 2104.06s

Probably a pretty darn good thing to be unit testing because that's a crap, right? Yeah, exactly.

Speaker 42104.22s - 2109.12s

Like I don't want to screw that up, right? So don't want to screw that up right so don't want to mess that up so that's that's a lot of them i don't

Speaker 22109.12s - 2116.28s

have a lot of like unit testing like the view models and the patterns around them but i do have some

Speaker 42116.28s - 2123.6s

ui tests as well those are old but i've i've kind of kept them working they're all appium based now and

Speaker 22124.16s - 2125.72s

mostly i have them because I want

Speaker 42125.72s - 2129.62s

to have an easy way to take all the screenshots when I update the app so that I can update the

Speaker 22129.62s - 2137.3s

store listings. All right. But it's on my list to add, you know, some actual more, now that I've

Speaker 42137.3s - 2148.46s

done the work to have a proper, you know, encapsulation, I guess maybe you want to call it of my logic. That's all,

Speaker 22148.58s - 2153.18s

it's all unit testable now. Like my view models would, and my, my navigation service could be not

Speaker 42153.18s - 2157.48s

mocked out. I could, I can do all that. I just haven't done it yet. Now, now,

Speaker 22157.48s - 2161.38s

now here's a good question, because you're doing a lot in Blazer PRODUCT, right? You got, you got,

Speaker 32161.38s - 2169.78s

you got some UI in Blazor. So obviously now now the more zammel you have the harder it is to

Speaker 42169.78s - 2177s

bring over to blazer would that be a fair because so again i i i don't i don't mind zammle FAC at all i like

Speaker 22177s - 2183.62s

sammel PRODUCT it is verbose i don't want carpal tunnel so i do what i need to do in zammle i get in i get out i love grids

Speaker 02183.62s - 2185.26s

i love the way it lays out.

Speaker 22186.06s - 2190.84s

What I don't love, like I said, is the converters, the extensions, you know, all that stuff.

Speaker 42191.2s - 2202.12s

But if in a world, as we look forward 10 years down the line, and this is just my two cents, John PERSON won't, John's not going to put his stamp of approval on it.

Speaker 22202.12s - 2203.72s

God knows nobody at Microsoft ORG will.

Speaker 42203.94s - 2204.96s

But I don't see Zammel ORG.

Speaker 02209.56s - 2215.2s

I see a world where unfortunately web wins, which sucks because there's too many divs. There's already enough divs. And I do like Zammel ORG. I do like C-sharp markup. But I think

Speaker 52215.2s - 2220.6s

web just wins at some point. So the more Zammel ORG heavy you are, the harder it will get to

Speaker 42220.6s - 2224.7s

Blazer PRODUCT. And maybe that's a case you never have to worry about. But as I look at customers,

Speaker 52224.7s - 2229.26s

some of the hard screens, especially around stuff like collection view, you know, some people go so

Speaker 42229.26s - 2234.8s

crazy that some of those things, and I think I've talked about like the response of grid layouts that I've had to do,

Speaker 02235.22s - 2241.4s

like where the columns are different sizes, like it's not just an equal grid point. Um, you're going to do those,

Speaker 42241.52s - 2264.08s

I've done those in Blazer and been quite successful, right? Yeah. But the more Zammel ORG heavy it's been, obviously the more, the harder it is to bring over, the harder it is to do because you've got all that logic tied up. Whereas if it was just in the view model, right, it was very easy to just say, use this data, here's the layouts, go do your thing. Because CSS does like responsiveness. Yeah.

Speaker 22264.52s - 2265.4s

I mean,

Speaker 42265.44s - 2274.12s

my experience was was really not that it was challenging from the view model perspective to do what I need to do.

Speaker 12274.22s - 2278.64s

It was like I really just took like, okay, I have this SAML page.

Speaker 22278.82s - 2281.24s

It's going to be a razor component.

Speaker 12281.98s - 2282.82s

I have this.

Speaker 22283.78s - 2286.32s

I do like, well, here's another thing for XAML. Like,

Speaker 42286.32s - 2290.88s

I don't know how much you make use of like, you know, user controls, I guess if you want to call

Speaker 12290.88s - 2298.6s

them that, right? Like a, a ZAML content control based on whatever. So I tend to, to divide stuff up

Speaker 22298.6s - 2332.28s

like that. Like for my, my apps home screen, it's basically showing an overview of like what your chemical levels are at. So it's kind of like the five or six depending on your how your pools configure different cards that show like for your free chlorine levels. Like what's the last date you did a test on? What's the current level at? Do I want to show like an indicator that says like, hey, this needs attention because it's not looking good. So like that card is like I put that into a control, right?

Speaker 02332.28s - 2334.24s

So that becomes a razor component as well.

Speaker 12334.36s - 2336.82s

So it was pretty simple in that sense.

Speaker 02336.9s - 2349.16s

It really was just like, how do I make this ZAML appear in HTML? The actual like getting the data connected. I mean, my view model is just plugged right in for the most part and it was pretty simple.

Speaker 42349.96s - 2356.56s

Well, and if we go back a second and we talk about ZAML with custom controls, think about how much stuff has to go into those binding points, right?

Speaker 52357.12s - 2362.06s

So just like a, like a, if I have, let's say, a label and an entry, right?

Speaker 42362.08s - 2364.94s

So I put them together as like a form field, right?

Speaker 32364.94s - 2365.04s

So it's because you can't really and an entry, right? So I put them together as like a form field, right?

Speaker 52367.78s - 2368.16s

So it's because you can't really have an entry without saying what it is.

Speaker 32369.54s - 2369.7s

You could do placeholders, whatever.

Speaker 42371.56s - 2372.16s

But let's just say we have a label and entry.

Speaker 52376.84s - 2377.06s

So now I'm obviously not going to open up all the bindable points on the label,

Speaker 42379.58s - 2379.7s

and I'm not going to open up all the bindable points on the entry,

Speaker 12380.92s - 2381.1s

and there's going to be overlap there.

Speaker 42382.38s - 2382.82s

So how do you deal with that, right?

Speaker 12383.02s - 2383.12s

Yeah.

Speaker 22383.86s - 2383.96s

You don't.

Speaker 12389.74s - 2394.92s

You really open up what you need, but that's still a lot, right? Yeah. And it's a lot of C-sharp code even, right? Like, to create the bindable properties and to wire it all up. Yeah. And I think in that sense,

Speaker 42394.92s - 2402s

like moving over to Razor ORG components for that same thing was quite a bit easier because it wasn't,

Speaker 22402.12s - 2409.5s

it's a parameter, right? Like, it's so much less ceremony to to build the thing exactly and now I know there's stuff like source generators out

Speaker 42409.5s - 2414.6s

there now that help with like the statics I don't have you used them I don't personally use them

Speaker 02414.6s - 2419.46s

I usually just do that stuff I've got like some snippets and I go bang bang bang

Speaker 22419.46s - 2425.2s

type in my stuff it just it works It's not ideal, but it works.

Speaker 02425.98s - 2428.34s

But again, still that, that's the raw stuff.

Speaker 42428.42s - 2433.74s

That's what I'm talking about. It's all that zamil verbosity and typing.

Speaker 32433.88s - 2437.34s

That's where I tend to worry about those things.

Speaker 02437.34s - 2439.5s

And I've seen companies put so much into that.

Speaker 42439.66s - 2447.82s

And it's great. But again, if you focus on the controls, you're pretty good. You focus on handlers. You can get rid of stuff like behaviors and all that stuff.

Speaker 32448.46s - 2451.38s

But don't get wild with those converters or extensions.

Speaker 42451.62s - 2458.52s

I'm telling you, I have not seen good. I want to be proven wrong. John PERSON, yours doesn't count because you're the only owner. You don't have a team to work with.

Speaker 52458.62s - 2459.26s

So it's not fair.

Speaker 22459.82s - 2460.84s

It's when it's a team.

Speaker 02462.16s - 2467.78s

And I feel like the markup extension stuff, though, like, that's not, I mean, I'm sure

Speaker 22467.78s - 2470.26s

there are people that are making their own and using it that way.

Speaker 42470.26s - 2485s

But I think, like, that was more a thing for like almost the actual Maui ORG implementation, too, right? It's because we have, like, markup extensions that unless, you know, if I'm, maybe I'm not understanding the breadth of what you mean by extensions either.

Speaker 02485.92s - 2487.1s

But there's things like, yeah.

Speaker 32487.1s - 2494.54s

So there's things like I use now in, in, uh, zamel, the like stroke shape has a markup

Speaker 02494.54s - 2506.3s

extension where you can, you know, specify a nice little tidy stream that, that mentions both the shape that you want to use. And if it's a rounded rectangle, you can also put the

Speaker 42506.3s - 2513.4s

corner radius in it, too, right? It's like the fast way of doing like a grid row definition.

Speaker 22513.4s - 2517.14s

Yeah, yeah, exactly. Yeah, which is that, that's the same idea thing too, right? So like,

Speaker 42517.14s - 2522.24s

they're handy for that. Saving me carpal tunnel syndrome. And there might be more markup extension

Speaker 22522.24s - 2533.58s

things that we could put into Maui ORG itself or maybe the community toolkit add some that do kind of neat things there too. But, like, yeah, I don't think that's something I would generally build for my own use that much.

Speaker 42533.9s - 2541.1s

I'd have to have a really compelling case. Education. Education. That's what I'm looking for us. What the heck do you use these things? Please don't use them for localization.

Speaker 22541.94s - 2545.72s

Oh, I was just going to say, like that was, that was maybe a case that I looked at,

Speaker 42545.72s - 2549.74s

but I didn't end up doing that because I didn't, I wanted the strongly type stuff, right?

Speaker 12549.74s - 2549.98s

So.

Speaker 42550.58s - 2550.8s

Yep.

Speaker 12550.96s - 2555.66s

And that's all I'm saying is that the places where I've seen them used, I haven't seen them

Speaker 42555.66s - 2558.86s

used appropriately, in my opinion, my opinion.

Speaker 52560.2s - 2560.42s

Yeah.

Speaker 22560.52s - 2566.22s

But there's, there's also stuff like we, I think we use this as one of our Nugits of the

Speaker 42566.22s - 2568.04s

week one time was compiled bindings.

Speaker 52568.04s - 2569.82s

Yeah, I was just going to say, you're probably going to say the same thing.

Speaker 42569.82s - 2573.58s

And compiled bindings is essentially, everything's a markup extension when you look at it, right?

Speaker 22573.7s - 2576.24s

Even the binding is essentially a markup extension.

Speaker 42577.24s - 2582.7s

But X bind was the one that, now, I don't know why I don't use it more.

Speaker 22583s - 2584.42s

Do you use it extensively?

Speaker 42585.18s - 2590.74s

I had it in my app and then I just kind of like started trying to look at it and got

Speaker 22590.74s - 2593.62s

sidetracked with something and I just never forgot about it.

Speaker 42593.78s - 2593.98s

Yeah.

Speaker 12594.7s - 2600.06s

Because like in theory, this is the thing that maybe would be, it would be good for me to go

Speaker 32600.06s - 2610.44s

and revisit my converters and see like that could be, you know, using this compiled bindings, X-Bind stuff instead of a converter. Because a lot of my stuff is like super simple, right?

Speaker 42611.12s - 2615.44s

Well, and it's great for those cases where, so if you've got like a multi-binding, right,

Speaker 02615.44s - 2620.92s

so you can go not this of the data type, but is equal to this. Like you could do those

Speaker 12620.92s - 2629.16s

and you could do like a straight exclamation knot. And you could do an and or an or right there, which is quite powerful.

Speaker 22629.32s - 2631.02s

I don't know how fast it is.

Speaker 42631.78s - 2631.98s

Yeah.

Speaker 02632.22s - 2633.84s

I mean, it's called compiled.

Speaker 42633.84s - 2638.32s

I was going to say, like, I think the claim is that it is all compiled.

Speaker 22638.56s - 2641.76s

I don't know in practice, you know, what it looks like.

Speaker 42642.24s - 2649.8s

But it certainly does look interesting. Yeah, exactly. And I know, like I said, C sharp markup gets around that because they don't need to do any of that.

Speaker 22649.9s - 2654.9s

Like it's just kind of comes natively out of the box. Now, another project where I've seen kind

Speaker 02654.9s - 2659.66s

of those bindings, and this goes outside of Zammel ORG, but if we look back, I like bringing up

Speaker 42659.66s - 2664.44s

MVPM cross because I think like the dot net mobile world learns so much from that. Yeah.

Speaker 22664.44s - 2674.62s

And all the experiments that Stewart PERSON did. Yeah, I think a lot of like Zamorin forms, you know, took some, some informing from that work too, right? Like, right?

Speaker 42675.12s - 2683.36s

So he had some, the bindings for, against like the Android markup and the iOS PRODUCT, well, iOS

Speaker 32683.36s - 2686.72s

was a bit different, but it was, it was very powerful. Like, he had, like,

Speaker 42686.74s - 2694.68s

the X-bind stuff back in those days, right? Which wasn't like pure Zammel ORG, WPS style, it didn't

Speaker 32694.68s - 2701.06s

exist yet. This was before Zammered forms. And it was beautiful. The binding just worked. I think he

Speaker 42701.06s - 2728.18s

had a cool nickname for it, because that seemed to be something that he did. Yeah. Right. Right. And it had all those powerful things. How fast it was comparatively. I guess I never saw an issue, but I mean, I know. Yeah, companies used it. Well, I know, like I said, I think before too, like Greg Shackles, like they, when they were using Zamarin for their app and at Olo there, they were MV MVM cross, at least for, you know, the first several years.

Speaker 12729.84s - 2734.68s

And it fit really nicely with Android PRODUCT, like when you were doing the Android, you know,

Speaker 32735.02s - 2736.64s

layouts in XML, right?

Speaker 12736.72s - 2738.12s

The AXML.

Speaker 42738.12s - 2740.78s

Yeah, like, you're right.

Speaker 22740.84s - 2746.88s

It's kind of like reminiscent or maybe, maybe ZAML is reminiscent of what they did there,

Speaker 42746.92s - 2747.38s

like you're saying.

Speaker 22747.82s - 2749.14s

But it fit very nicely.

Speaker 42749.74s - 2750.16s

I like it.

Speaker 22750.16s - 2754.58s

It was obviously ZAML came probably first, but.

Speaker 42754.78s - 2758.16s

I mean, yeah, like Windows Zammel PRODUCT, I'm sure, WPF or whatever.

Speaker 22758.16s - 2761.44s

And I know MVM Cross PRODUCT ended up going more to the expression-based binding.

Speaker 42761.62s - 2767.06s

So like the C-sharp markup style, I mean, obviously that's the preference.

Speaker 22767.18s - 2771.14s

But now with stuff like data types and kind of the compiled samil, you don't really

Speaker 42771.14s - 2778.46s

notice that the same. So maybe it's a case to look at X-binding or this compiled bindings again because we can't

Speaker 02778.46s - 2783.06s

make it our plugin of the week twice in a row, but it's something I'd love to try again.

Speaker 22783.44s - 2786.58s

Yeah, I mean, you're making me want to like go in and

Speaker 32786.58s - 2791.66s

spend an hour and just like see how many converters I can rip out and use X bind instead. So maybe I'll

Speaker 22791.66s - 2796.96s

have to do that. Oh, there we go. I've started John PERSON on a mission. The other thing too that like

Speaker 02796.96s - 2802.64s

talking about compiled bindings, uh, that not everybody necessarily always knows, right? Like this is,

Speaker 32802.64s - 2805.06s

this is shamefully something I didn't do in my own app until I migrated it to Maui ORG, which was to actually declare the data type that you're knows, right? Like this is shamefully something I didn't do in my own app

Speaker 22805.06s - 2808.12s

until I migrated it to Maui ORG, which was to actually declare

Speaker 42808.12s - 2809.72s

the data type that you're using, right?

Speaker 22810.62s - 2813.82s

Because it's like right there is a almost free

Speaker 12813.82s - 2815.36s

instant performance boost, right?

Speaker 22815.36s - 2819.1s

If you're able to articulate the data type in your ZAML

Speaker 42819.1s - 2822.92s

so that the ZAML compiler knows, hey, I know what this is.

Speaker 22822.92s - 2825.8s

I can actually like emit better code that's not

Speaker 42825.8s - 2832.56s

going to be invoked dynamically at runtime to the same extent and do the thing. And it

Speaker 22832.56s - 2836.8s

intelligence. Yeah. And Intellisense. But it warns you now, too, when you haven't done that. It's like,

Speaker 42836.8s - 2842.66s

this is now interpreted. Enjoy. Well, and this is one of the, actually, the funny we're talking about it.

Speaker 22842.66s - 2850.5s

This is an issue that just kind of came up to, or not that just came up, but I was talking to Stefan PERSON on my team, who's the kind of the, you know.

Speaker 42850.5s - 2851.44s

He is the Zammel ORG guy.

Speaker 22851.56s - 2852.68s

The Zammle ORG guy, yeah.

Speaker 42853.84s - 2862.16s

Where if now with Maui, because like, we're not running Zammel ORG compiler, ZAMLC at debug time, right?

Speaker 22862.36s - 2902.5s

We do kind of like a different version that's trying to help identify issues, but if you debug your app, it's doing everything dynamically, like all full dynamic bindings. There's nothing compiled in debug mode. And so what happens sometimes isif you specify a data type, but then at runtime, you're like giving it not an instance of that type. In debug mode, it's going to like try and reflect over the properties and it might just work fine because the property name that you bound to exists on the type that you gave it, even though it's not the data type that you told it was going to be.Because it, I mean, truthfully, at debug, it doesn't, we don't care about what you say the data type is, basically.

Speaker 12903.18s - 2945.04s

But if you start then building your app and release mode, basically it's just going to not like work sometimes, right? It's going to say, oh, and I think what's happening is it thinks of it as basically doing like a binding context as, you know, the declared data type that you gave it. And if that fails, you know, you've got like a null instance essentially that you can't get the property value out of. So you might have a labelthat in debug mode has text, but because you declared the wrong, well, you declared a data type that's different from the one you gave it at runtime, suddenly your label has no text when you build for release mode. And it's not implode, no?

Speaker 42945.62s - 2948s

Well, it's one of those hard.

Speaker 22948.06s - 2949s

It's complicated.

Speaker 42950.28s - 2950.72s

Yeah.

Speaker 22950.92s - 2953.02s

You can always tell when John PERSON's about to say that.

Speaker 42954.04s - 2954.36s

Yeah.

Speaker 22954.68s - 2961.86s

Yeah. So we're going to try and do something to make that a better, you know, experience in terms of like discovering those cases,

Speaker 42961.86s - 2980.82s

but it's not as simple as you might hope it is, which is just the story of life. Now, the last thing I wanted to bring up, so this isn't in our notes. I love to just bring these things, but I know this is,I know this is truthful, is the great Jonathan Peppers PERSON, I'm pretty sure I can quote him on this.

Speaker 22981s - 2981.24s

Sure.

Speaker 12981.34s - 2982.92s

He's like the performance guy, right?

Speaker 22983s - 2986.22s

He's the Maui ORG performance guy. He's the guy that goes in and digs.

Speaker 42987.42s - 2988.9s

He'll dig the steep in style.

Speaker 22989.9s - 2992.5s

Yeah, he'll dig as deep as he has to, right?

Speaker 12992.82s - 2993.06s

Yep.

Speaker 22993.46s - 2997.6s

So I know he has mentioned, and I know a lot of us know this from the past, right?

Speaker 12997.6s - 3001.88s

Like converters obviously imply a lot of extra overhead.

Speaker 23002.5s - 3005.48s

So when you're using them simple in forms and like one-offs,

Speaker 43005.48s - 3006.5s

it's not a big problem.

Speaker 13006.82s - 3011.46s

When you use them in a collection view where performance is already a bit of a,

Speaker 43011.82s - 3012.38s

of a fight,

Speaker 53012.98s - 3016.68s

they get really bad because now we're working with,

Speaker 03017.94s - 3018.22s

you know,

Speaker 43018.22s - 3020.06s

sometimes a lot of converters.

Speaker 03020.56s - 3020.74s

Yep.

Speaker 53020.82s - 3026.48s

And they will slow down the binding of those items a lot, right?

Speaker 43026.48s - 3031.6s

Because everything's, especially ones with like data templates where it's flipping around the types.

Speaker 13031.84s - 3033.14s

I've seen it, right?

Speaker 43033.3s - 3039.9s

You take the converters out and it's almost an immediate improvement visually, let alone, like right down to a timed level.

Speaker 13040.44s - 3047.96s

So I know I read recently, John Pepper's ORG came out and said, yeah, if you're using converters in a collection view, you're going to have problems.

Speaker 43048.5s - 3053.4s

I mean, that's as far as he needed to go. But it's true. I've seen it.

Speaker 23053.56s - 3053.64s

Right?

Speaker 33053.64s - 3058.56s

Could I tell you that I use converters in my collection view templates in my app still?

Speaker 23058.9s - 3061.02s

Hey, well, I'm just the bearer of the news.

Speaker 43061.32s - 3061.9s

Don't, don't get them.

Speaker 23062.24s - 3074.38s

Yeah, no. I minimize them, but I still use some of them. But, and then, you know, again,it got to the point where I'm like, yeah, this is working fine. I don't actually need to dig farther.But if I did, I'd probably go after them.

Speaker 43074.72s - 3077.54s

But again, you don't have a problem. So why engineer a solution

Speaker 23077.54s - 3096.78s

for a problem you don't have? So is that first rule of optimization? Yeah, exactly. And there's customers I work with it. When I optimize everything, you're like, dude, that there's customers I work with that want to optimize everything.You're like, dude, that last 2%, so to get that, you really want to pay for that last 2% of details. It's going to cost you, you know, like 80 hours.

Speaker 43097.14s - 3097.54s

Why?

Speaker 33098.04s - 3098.86s

Don't dig.

Speaker 53098.98s - 3102.56s

Wait until customers say this is a problem, then dig. Right?

Speaker 43102.62s - 3134.48s

Because now you have value like a cost associated with the value. Right. Right. But some of them want to, whatever. This is a case you didn't have to. Converters are working fine in your collection view. Are you using your virtualist view, though? I am. Although I did, I did a branch recently because like we've got kind of a, you know, current effort of looking at collection view performance just kind of across the board all up because, you know, we know it's an area that people are still wanting a better experience around and there's still issues.

Speaker 23134.48s - 3139.34s

And there are some, there are some legitimate, you know, concerns around performance and things we can do to fix them.

Speaker 43139.9s - 3145.28s

So I did switch back to collection view on a branch just to see, like, yeah, where are we at today?

Speaker 23145.28s - 3154.9s

Because for my app, one of the use cases was I have a data template selector, and then I have probably five different data templates that could be selected.

Speaker 43155.82s - 3159.88s

And they're not, like, there's not really a consistent pattern, right?

Speaker 23159.88s - 3240.1s

It's like whenever you add a log, if you're adding like an expense log or a chemical test log or an addition log or a note log or whatever other logs I have, it's however you add them in your app, right? So there's no like pattern to the order that these things show up. And back in the day in forms and still into early days in Maui ORG and till I think net eight it was all fixed. Our data template selector code for collection view, like on both Android and iOS PRODUCT basically was like for any kind of data template, like it only kept track of one type of data template and it would, as it's recycling templates, it's like, oh, this isn't the, you know,type of data template that the selector wants. I'm still going to use this, but I'm going to get rid of the thing that was in there and put the new thing in. And so like it kept churning over and over every time like a new template was needed. It had to like rebuild on a recycled cell, right? And so I did a PR a while back that basically was like,no, no, no, like let's track, you know, the recycled cells per type that we get back from the type, the data template selector. So we're not. So we have a pool of each type that you're

Speaker 43240.1s - 3244.54s

using, right? Instead of like, getting one from the pool and being like, oh, that's the wrong one.

Speaker 23244.6s - 3245.94s

I need to make a new one

Speaker 43245.94s - 3248.2s

over and over again, like keep track of that.

Speaker 23248.2s - 3250.16s

So it has gotten a lot better.

Speaker 43250.8s - 3255.56s

And here's the thing. If we're looking at that and we're putting in converters, converters are very eval-based.

Speaker 23256.18s - 3258.06s

Are they not? Right? They're not really

Speaker 43258.06s - 3262s

I mean, there's going to be reflection because it's

Speaker 23262s - 3263.88s

all like to an extent, right?

Speaker 43263.88s - 3274s

Because I mean, it's all like objects coming in. So there's casts and stuff and it maybe isn't that horrible. But it, from what I've seen is that they're all eval based because they have to be, right?

Speaker 13274.06s - 3276.78s

Like it's, it has to reflect them out.

Speaker 43276.82s - 3287.4s

It has to do the thing. But that's all a cost. So reflections usually cheap. One-offs, a couple times in a form, not a big deal. Those collection views. um like i said

Speaker 53287.4s - 3291.96s

some of these customers are using a lot of these these converters right now even in an item

Speaker 13291.96s - 3297.4s

there's one performance case i'm tackling right now now their main problem is they've got stack layouts out

Speaker 43297.4s - 3303.72s

the wazoo well that's another point maybe to talk about as well right well and and a lot of people

Speaker 53303.72s - 3306.22s

okay so that's a great one in terms of Zammel ORG.

Speaker 43306.6s - 3309.1s

A lot of people want to use stacks because they're very easy, right?

Speaker 23309.3s - 3311.74s

Stack here, you just keep nesting stacks all over.

Speaker 43312.08s - 3315.04s

But the problem that happens there is more measurements, right?

Speaker 23315.12s - 3319.54s

So it has to measure the innermost guy to get the measurements to the outermost guy, right?

Speaker 43319.92s - 3321.84s

And it's like a bubbling effect.

Speaker 23321.84s - 3346.76s

I could be Ron PERSON at this point because, I mean, I don't get to touch code as much as I, you know, used to back in the day at this point in life. But I think we might still end up instantiating like a platform view for most layouts. I don't know if we've compressed that down or not. So I might be wrong. We might have optimized that away finally.But I suspect not. And so every time you add

Speaker 03346.76s - 3358.16s

another level of these these layouts, like you're at your you're getting another platform native control backing it. I think I think that's where we are still. Right. And so these these these

Speaker 43358.16s - 3364.7s

layouts, these stack layouts, especially within a grid, again, the people do them because I mean,

Speaker 23364.78s - 3366.48s

you're old enough to have done tables in HTML, right? Yeah. tables were people do them because, I mean, you're old enough to have done tables in

Speaker 43366.48s - 3372.18s

HTML, right? Yeah. Tables were great. They were, they're hated now. Nobody used to, you do it.

Speaker 23372.26s - 3376.82s

I know, I still write HM on. I'm like, what do I do tables now? Everyone's using these things.

Speaker 13377.06s - 3381.36s

These divs. Everybody uses a div now. Well, how the hell do I use that? But anyhow, it was,

Speaker 43381.36s - 3386.02s

it was a big thing to use tables. It was very comfortable, right?

Speaker 23386.06s - 3388.06s

Because you knew exactly how it was going to lay out in a grid.

Speaker 43388.9s - 3392.06s

Now, for some reason, because Amel ORG is so easy to do these layouts, right?

Speaker 23392.06s - 3394.56s

So you can be like, I want these two things grouped together, right?

Speaker 43394.56s - 3398.08s

So going back to our form item, right?

Speaker 03398.1s - 3401.66s

So I might do, listen, I'm going to put that in a horizontal.

Speaker 43401.98s - 3419.74s

So there's the label. There's my entry. It's horizontal. I can set the buff, the padding, etc. done. Next, next element, right? And then all those horizontal layouts go in one big vertical layout. So it's easy. It's comfortable. It's a natural look. But what it's not

Speaker 03419.74s - 3425.1s

is performant. So I've switched this one particular view.

Speaker 43425.52s - 3439.26s

It's a big, big, big view into a grid layout. Now you have to do stuff like remembering which row you're in, which column you want it in, where you've got the spans. Like it can be a lot. It's not natural like a table was, right?

Speaker 33440.64s - 3441.42s

Because you have to.

Speaker 43441.42s - 3444.56s

It's not hard. It's not hard, but it does. You have to think a bit.

Speaker 23444.7s - 3448.18s

You have to do your mental math of, okay, what row and what column am I in?

Speaker 33448.24s - 3451.38s

Whereas with table rows and table data, you knew where you were, right?

Speaker 23451.82s - 3453.26s

Relatively. Yeah.

Speaker 13453.3s - 3458.56s

So people tend to go with the stack layouts and they're shooting themselves in the foot the same time.

Speaker 43458.62s - 3459.92s

They're doing it because it's comfortable.

Speaker 13460.02s - 3462.54s

It's a comfortable way of doing it in Zammel ORG, right?

Speaker 43462.54s - 3466.32s

It's essentially doing table data's with table rows. So it's doing.

Speaker 23466.72s - 3466.88s

Yeah.

Speaker 13467.44s - 3469.02s

So don't do that.

Speaker 23469.02s - 3469.96s

So don't do that.

Speaker 43470.12s - 3472.98s

And don't, yeah, don't nest a whole stack of them and think that, you know,

Speaker 23473.02s - 3476.2s

you're going to get good performance on a list that's scrolling, right?

Speaker 43476.2s - 3483s

Like this collection view couldn't size itself properly. It's slow when it starts scrolling, like, really slow.

Speaker 23483s - 3510.68s

Well, this is another thing, right? So, like, talking about vertical stack layouts and scroll views and collection views, like people tend to nest weird combos of controls that all want to kind of compete for infinite space in one of the dimensions. Right? So, like, having a vertical stack layout, you know, usually is okay in like a data template, you know, cell if it's like the outer.

Speaker 43511.12s - 3512.7s

Yeah. Yeah, go one off.

Speaker 23512.76s - 3519.74s

It's fine. But then, you know, we'll see people do stuff like put a collection view inside a scroll view. And like they're both vertical oriented too.

Speaker 43519.84s - 3521.84s

And they're like, why is this not working well?

Speaker 03521.84s - 3530.88s

Because they both want to take up infinite space and it's not sure how to handle that kind of stuff. So be smart about how you nest stuff like that too.

Speaker 43531.08s - 3541.96s

Well, and that's, again, this is again where Zammel ORG is powerful and also pain is if we look at something like, so that scenario you just talked about it's usually people that have like a dashboard.

Speaker 33542.32s - 3545.6s

They want to show like the top five items for this, the top five items for that.

Speaker 53545.68s - 3547.46s

And they're like, well, a collection view. That's how you do a list.

Speaker 43548.3s - 3550.38s

Well, no, it's actually not.

Speaker 23551.04s - 3553.5s

That's pretty heavy if your list is, yeah, exactly.

Speaker 43553.84s - 3556.76s

It's a bindable stack layout or a bindable grid.

Speaker 23557.38s - 3576.78s

And you can just render. And that's going to render the size. Like it's not going to virtualize it, obviously. Right. It's just going to, this is what you get. But with trying to virtualize, you know, there's weight that you incur trying to do that.So, yeah, if you don't have like a lot of items to scroll through, just, yeah, just use the bindable stack layout.

Speaker 43577.72s - 3579.66s

And then that way you can have one scroll view.

Speaker 23579.98s - 3585.16s

It's not going to be virtualized, but, you know, limit the types. And I've got some of those that work.

Speaker 43585.62s - 3628.74s

You can get away with quite a few controls in that scenario with it being still very performant, right? More than 30. More than 30. Yeah, I know. I know.I know. I'm just saying, you wouldn't have been able to do that back in the day either. I had to make the dad jokes somewhere. Now, this is the thing, right? So a lot of these troubles are because of Zammel ORG and because of the comfort of Zammel. So that's why we like to point out, like these are the things that I'm not saying I'm right.I'm not saying I'm wrong. I'm just saying inexperience. These are the things that people do in Zammel ORG that tend to hurt and cause pain. I realize it's a comfortable way of doing it and it looks like the right way to doing it, but it probably or might not be, always check the other side.

Speaker 23629.6s - 3633.04s

But for all that's wholly, please do localization review model.

Speaker 03633.66s - 3634.46s

That one I'll die on.

Speaker 43634.7s - 3636.4s

Is that fair? I can die on that.

Speaker 23636.4s - 3637.4s

I think so.

Speaker 43637.54s - 3647.06s

Yeah, I think mine, I'm mostly like that. So I'll agree to it until I go outside of that box. All right. Somebody can, you know, set fire to a comment or something.

Speaker 23647.4s - 3715.46s

Oh, the other thing, you know, looking through some of my code, too, if we're talking still optimizations. Like if you've got kind of like an abstracted out, you know, user control, people tend to think that like you do the new item template and it's like a content view, right? Which is okay. But if you don't really need that to be a content, like if you've got that and then you right underneath that, you put a grid in there, make, make the top level thing in the grid, right? Like stop nesting stuff within itself. Like that user control file can be. And I did this. I did an audit ofthis because I have a fair bit of like user control kind of abstraction of things. And I found, you know, an all my code too. I'm like, oh, I have like a lot of this bit of, like, user control kind of abstraction of things. And I found, you know, an all my code to, I'm like, oh, I have like a lot of this redone, like extra lay, extra controls and stuff that are nesting just because I was too lazy to go change the item template from a content view to, you know, a grid. And it's not hard to do. You change it in a couple places.And then your grid is the direct thing, right? And then you just saved yourself one more layer of controls. So like there's lots of really easy ways to kind of optimize the ZAML. But again, it's kind of like that's that's ZAML making it kind of

Speaker 43715.46s - 3729.58s

easy to do it the wrong way. One of the things I also tend to see that since we're on that content view is they'll use it. And I'm guilty of this too, right, as using it as like an empty view holder, right?

Speaker 03729.66s - 3734.02s

So it's, like let's say you've got, if you're in this mode, you show this content view,

Speaker 53734.02s - 3738.9s

otherwise show this content view. They'll use that, because it doesn't have any background.

Speaker 43739.14s - 3744s

It doesn't, it's basically an empty holder, place holder, right?

Speaker 53744.16s - 3747.72s

So they'll do content view, content view, and you'll probably do that in a stack layout.

Speaker 43748.6s - 3754.24s

That's common. It's understandable, but that's, again, understand kind of what you're doing there. Yeah.

Speaker 13755.24s - 3756.56s

That's another problem with AML ORG though,

Speaker 43756.58s - 3763.06s

is that you need to have that placeholder in a layout. You can't have placeholders and then say, put it in this layout, right?

Speaker 23763.22s - 3798.26s

Yeah. You can't really do that. No, I mean, yeah. The only way, like, I have cases of that too where I've got like the, like, for my list, I have like a template and every item has a few of the same things in the same spot. And then I have kind of a content placeholder, which is a content view. But like the, I don't know the outer view of the kind of what goes inthere for each thing always. So I haven't found a good way to kind of not nest that extra more than it needs to be yet. So sometimes you kind of have to. Maybe there's a way.

Speaker 43798.66s - 3805.48s

Maybe. Educate us. Educate us. Somebody that knows this. Again, I've gotten by pretty good.

Speaker 23805.78s - 3807.8s

I'd like to say my success ratio is pretty high.

Speaker 43809s - 3813.44s

But I don't often tend to have to go too far outside of the box for Zammel ORG.

Speaker 23814.28s - 3816.32s

I am doing a lot of C-sharp markup these days.

Speaker 43816.78s - 3816.94s

Yeah.

Speaker 23817.06s - 3818.58s

Are you switching to that a little bit?

Speaker 43819.66s - 3829.86s

A lot of it, I am doing a lot more blazer stuff for some of the apps I'm working on right'm working on right now just because the views, like I said, that responsive layout, it's just, web is easy

Speaker 03829.86s - 3841.66s

to do it in. I don't know that there's any layout natively, like Swift UI PRODUCT. I tried to do it in Swift UI with like a dynamic grid-based, think like Pinterest ORG. That's what I'm kind of talking about.

Speaker 23841.66s - 3862.36s

Yeah, oh yeah, that's a hard one. That's a complicated view. I have not seen anything out of the box to do that anywhere. The UI collection view, like the compositional layout stuff is probably what may be the best attempt at making that achievable, more generically speaking that I've seen, but it's still not easy. Like you

Speaker 43862.36s - 3872.08s

have to think about it. Yeah. So I didn't have success. I'm not a master UI specialist. I basically, I need a designer to make something pretty, and then I go and go, that's a grid, great.

Speaker 23872.14s - 3873.4s

Yeah, that, yeah, exactly.

Speaker 43873.56s - 3891.54s

Like, that's the case where I run into them. Like, I know we're going to make some different, you know, design choices here because this is not going to be easy to implement. So, so that one, like I said, it's easy. I can go to like a bootstrap or any of those those HTML frameworks where this is common because it's a desktop pattern, right? And

Speaker 03891.54s - 3897.7s

those responsive kind of. And it was just easier. It just was. And that's fine. Pick what works for you.

Speaker 33898s - 3903.82s

Was it as performant? I don't know. I mean, I didn't, I did not like the experience.

Speaker 03905.56s - 3905.64s

Yeah. Well, and it was not sammel PRODUCT not, not like the experience. Yeah.

Speaker 43906.72s - 3907.34s

Well, and, and.

Speaker 33908.44s - 3909.48s

It was not Samil PRODUCT.

Speaker 13909.68s - 3913.84s

And there's, there are other, you know, things out there that, that help with some of these areas, too, right?

Speaker 43913.84s - 3919.24s

Like, what's, uh, what's your, your pick for the week for the, the plugins and packages and products?

Speaker 23919.24s - 3923.32s

My package of the week is a plugin, or sorry, I don't want to call it a plug.

Speaker 43923.32s - 3923.84s

It's not a plugin.

Speaker 23923.92s - 3925.24s

It's a control library.

Speaker 43925.96s - 3934.18s

It's the Sharp Nato Collection View. It is an absolutely beautiful piece of work by Jean-Marie Alphonsei PERSON.

Speaker 53934.6s - 3938.26s

I hope I'm pronouncing you name. Speaking of saying, you know, whatever, using the wrong French LANGUAGE.

Speaker 23938.54s - 3944.82s

Yes, if I'm, well, see, yeah, it sounds French LANGUAGE. I'm assuming. Maybe it wrong. Sorry if I'm wrong. If we're wrong, we

Speaker 43944.82s - 3945.16s

apologize, feel free to slap us. I think he's a good comedian wrong. Sorry if I'm wrong. If we're wrong, we apologize.

Speaker 23945.4s - 3954.16s

Feel free to slap us. I think he's a good comedian anyways. If you've ever seen his tweets, he's hilarious. So feel free to slap us if he's said a neighbor. I'm fine with it. Love the sharp nato work always.

Speaker 43954.5s - 3965.26s

Yeah, it's fantastic. That thing, so I just did a grid with it recently. Very performant. So Johns does the list view very performant. His does the grid, the bindable grid, very performant. It has some wonderful the list view very performant. His does the grid, the bindable grid,

Speaker 03965.38s - 3975.92s

very performant. It has some wonderful infinite paging stuff in it too that works fantastic. By the way, I have PR coming for you for grid spans, but.

Speaker 43976.84s - 3977.38s

And there's,

Speaker 23977.5s - 3979.34s

you know, I mean, no,

Speaker 43979.38s - 3982.74s

no, the sharp, the collection view stuff is great, but like there's,

Speaker 23982.74s - 4005.16s

there's some other Sharp Nato stuff out there too. That's equally cool, right? Like different libraries too. Gets my stamp of approval. He's got tabs. He's got some. It's got like the task loader thing, right? Like the kind of skeleton UI or like lazy loading stuff. A bunch of great ones. But the collection view is my, my pick this week. It was fantastic. It performs well. It does bindable grids.

Speaker 44005.66s - 4005.86s

Very nice.

Speaker 24006.36s - 4010.52s

Chef ORG's kiss. I don't know if it's got Windows PRODUCT support yet, though.

Speaker 44013.48s - 4018.22s

Oh, well, I won't even get started on that. See, you poke the bear on purpose. You know I'm going to say something nasty about Wings PRODUCT, but I won't.

Speaker 34018.92s - 4019.12s

He's trying.

Speaker 24020.24s - 4024.06s

He's just trying to instigate. But you gave me a rule saying, just be nice. I'm being nice. Windows PRODUCT is easier now.

Speaker 44024.22s - 4031.58s

There's more APIs that we can use now for that kind of stuff. No. No, just for the collection view part of it. That's obviously. Okay. Okay.

Speaker 24031.58s - 4039.04s

Just just just like building the virtual list view, the hardest platform has been iOS PRODUCT, hands down. Okay.

Speaker 44039.42s - 4052.9s

You're still antagonizing. Just just just Windows PRODUCT is not, it's not a fun territory to play. And I'm happy to be told otherwise. It's fun territory to play in. I'm happy to be told otherwise. It's still, I'm going to be the rock. The immovable object on this one. Web, iOS PRODUCT,

Speaker 24053.02s - 4059.5s

Android, and even Android, I hate sometimes. iOS PRODUCT is just perfection. It's just perfection.

Speaker 14060.44s - 4066.6s

Mostly. All right, well, go, you know, maybe go maybe go write some ZAML, go check out the compiled

Speaker 24066.6s - 4071.24s

bindings in your apps. Let me know how it goes, Alan PERSON, so that I can decide if I want to try

Speaker 14071.24s - 4077.3s

and do that activity. I'll be the, I'll be the guinea pig. That's fine. Great. Yeah. And,

Speaker 24077.38s - 4082.7s

yeah, everyone else out there, too. If you want to check those things out, we'll put some links

Speaker 44082.7s - 4088.54s

on the show notes. The other thing that's worth checking out, I don't know if you know about this,

Speaker 24089.22s - 4093.34s

is leaving a review on Apple Podcasts ORG.

Speaker 44093.76s - 4094.02s

Oh.

Speaker 24094.2s - 4095.28s

That's worth checking out.

Speaker 44096.06s - 4101.56s

Yeah. I don't personally do that because, well, I don't listen to myself.

Speaker 24102.46s - 4117.02s

Didn't tell me if I'm too quiet or too loud? Did I tell you to go leave a review? Come on. I probably haven't left a review. I tell you to go leave a review? Come on. I probably haven't left. I'm going to go leave a review today. Is it going to mock me?No, it's going to be a five-star, like, you know, just really propping things up, getting all the reviews.

Speaker 44117.18s - 4120.58s

Oh, the other thing that we haven't talked about you. I don't know if this one will be yet.

Speaker 24121.18s - 4130.42s

We're going to start trying to push some of these to YouTube ORG. So I've been trying to keep my background more cleaned up. I don't know if you've put any effort into yours. No, but I can.

Speaker 44130.6s - 4137.02s

I have my nice toy collection, my lightsabers, my legal collections. I've just been like removing the

Speaker 04137.02s - 4141.38s

junk the kids leave there so that at least that's not there. That's all I mean by effort.

Speaker 24141.48s - 4145.72s

I haven't really done more than that. All right. I'll put some effort.

Speaker 44146.46s - 4147.04s

So, yeah.

Speaker 24152.76s - 4152.78s

Maybe be checking us out on YouTube soon as well, where you could, when we get all the things set up,

Speaker 44158s - 4158.46s

I don't even know all the stuff I need to ask for on YouTube, like and subscribe and all that stuff.

Speaker 14159.38s - 4160.52s

So we'll figure it out.

Speaker 44163.98s - 4164.38s

Or if, you know, you want to tell us how to do it, drop us a line.

Speaker 14169.08s - 4170.6s

You can always go to the website, gone mobile.io, and leave feedback one of the many ways.

Speaker 44179.28s - 4179.44s

If you have episode ideas, I don't think we're too short on them yet, but, you know, never a bad idea to consider a topic that maybe we haven't covered or thought of covering.

Speaker 24180.98s - 4182.18s

So send us some info.

Speaker 04183.36s - 4184s

I think that'll do it for today.

Speaker 14184.46s - 4184.82s

See you later.

Speaker 0s - s

Thanks for today. See it later. Thanks for listening. You know, and then, And then.