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.
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
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.