Xamarin.Forms: Static part of DataTemplate - xaml

I have a CarouselView where I bind my collection. For each item in ItemsSource I display some data related with current item. However by design / UI reasons in each of my item`s view I also add a part of view which I reuse all for all rendered items and is not related with binding.
<CarouselView.ItemTemplate>
<DataTemplate>
<!-- Part where I use current item for binding -->
<!-- Part where I have views which are not related with current item -->
</DataTemplate>
</CarouselView.ItemTemplate>
If I do put second part into current ContentView's resources and use as StaticResource by x:Key will I gain performance?

Related

ItemsControl StatusChanged equivalent in UWP

We were able to understand if ItemsControl finished it's rendering by checking Status within StatusChanged event in WPF.
How can I make sure that ItemsControl finished rendering in UWP? I want to make sure that rendering is completed and access some elements using ContainerFromItem.
I have custom dragging logic using events like ManipulationDelta. After rendering, I want to get the ContentPresenter's position based on it's parent UIElement and then use that position to draw some stuff using Win2D. I need item's position, so I need the container, so I need to make sure containers are rendered in the first place, and it goes like that.
To use ItemsControl in UWP, you also need to know about the UI virtualization. The ItemsControl uses UI virtualization. It means that not all items will be rendered at the same time, instead only the viewable area.
You could try the following code:
<ItemsControl x:Name="item">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Loaded="Grid_Loaded">
<TextBlock Text="{Binding}"></TextBlock>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
I registered the Loaded event for the 'Grid' which is included in every item.

Binding in ListView in XAML Xamarin

Could someone answer me the question about listview?
I have variable MyDatas which is collection of listview (and it works):
<ListView
x:Name="lstView"
HasUnevenRows="True"
ItemsSource="{Binding MyDatas}"> ...
Next I have (part of my code but is enough for explaining the problem):
<Label Grid.Row="0"
Grid.Column="1"
Text="{Binding E1}"
FontSize="{Binding FProp.Size1}"
FontAttributes="{Binding FProp.Atrib1}"/>
E1 is a field of MyDatas and this binding works correct. I have property of fonts in another variable FProp (FProp.Size1 and FProp.Atrib1) and this is problem! How can I use this another variable in this listview?
If FProp is used outside of listview all is ok, if I use it in listview it does not work.
Thank you for help
I believe you are not binding correctly the font size.
You are referencing a property named Size1 inside the object FProp which is not in your current binding context. The main problem is that you can only have one binding context per object. So, you should include the Size1 and Atrib1in your MyDatas object in order to make it available for the label. Another option is to change the binding context of the listview to point to FProp then you could access the values on the labels, but you will lose access to the E1 value. So you will need to choose how to fix this problem depending on the options provided.
You could add an x:Name to your ListView, let's say listView1 and use something like this
{Binding Path=BindingContext.FProp.Size1, Source={x:Reference listView1}}

Referencing an item in a VirtualizingStackPanel

I'm playing with the "Grid Application," which is a C++ Metro app template provided by VS11. The main display is a collection of items displayed in a VirtualizingStackPanel:
<ScrollViewer x:name="itemGridScrollViewer">
<GridView x:name="itemGridView">
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</GridView.ItemsPanel>
</GridView>
</ScrollViewer>
The actual items are displayed using the Standard250x250ItemTemplate data template defined in StandardStyles.xaml. One of the display elements of this is a graphic.
I'm trying to understand how to reference a specific item so that I can change the graphic at runtime. The ScrollViewer and the GridView have objects associated with them, so I can get to those, but I don't see how to get from there to the individual items.
All this stuff is completely new to me, so be gentle. :)
In general it's not a good idea to dig down into individual templated items in an ItemsControl because not only is it a pain, but that ItemTemplate can regenerate at different times (paging during virtualization, source collection updates, etc) and you'll be left holding an outdated UIElement that's no longer being displayed.
A better approach is to pull the data you need into the item data and in the ItemTemplate use Data Binding to make whatever changes you need to differentiate the UI. One option is to use an IValueConverter to get a different image depending on some state in the item data:
<GridView>
<GridView.ItemTemplate>
<DataTemplate>
<Image Source="{Binding Path=DataState, Converter={StaticResource MyStateToImageConverter}}"/>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
Here I'm assuming that the converter code has been written and an instance of the converter has already been declared as a resource (see here). You could alternatively do a direct Binding to a property on each item's data that specifies its image and skip the converter part.

Access a nested UserControl's ContentPresenter with Blend

I've created a simple UserControl in Blend which contains (amongst other things) a ContentPresenter.
I'd like to be able to drop this UserControl onto another UserControl and then add other controls into its ContentPresenter, but when I include it in the second UserControl I can't see a way to do this.
Using Blend, how do I expose the underlying ContentPresenter so that its contents can be set visually (ie: so they appear as child controls in the Objects and Timeline window)?
If it’s a content control, to add child controls you set them as the content of the control
<MyContentControl>
<Grid x:Name=”ImAChild”>
</Grid>
</MyContentControl>
Edit: now that I think about it you might need to do something to make the Content property the default property which is populated by the inner xaml of your control, I can't remember exactly what it was but if your xaml looks like this (below) it doesn't matter anyway
<MyContentControl>
<MyContentControl.Content>
<Grid x:Name=”ImAChild”>
</Grid>
</MyContentControl.Content>
</MyContentControl>
Edit2
Your MyUserControl would need a MyContent property of type object and it'd have to somehow display the value of that property. You might be able to create it in the setter of the MyContent property but it seems "hacky"
<MyUserControl>
<MyUserControl.MyContent>
<Grid x:Name=”ImAChild”>
</Grid>
</MyContentControl.MyContent>
</MyUserControl>

Hide list item in Silverlight 4

I have a silverlight application in which I display items in a list box.
I want to hide some items based on a condition, like some value of a string.
My xaml looks like this:
<ListBox
ItemsSource="{Binding DashboardTypes}"
SelectedItem="{Binding SelectedDashboardCategory,Mode=TwoWay}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
Style="{StaticResource ListBoxStyleAttribute}"
Margin="2"
ItemContainerStyle="{StaticResource ListBoxItemStyle}" />
You'll need to set up an ItemTemplate to describe your items and then add a binding on that for the Visibility property that controls when items are visible or not. I suspect that you'll need a converter to actually implement the rule for when an item should be visible.
There is a Stack Overflow question that covers something similar but in WPF. It should give you some pointers that will help you in implementing this.