Binding a property that hides another in WinRT XAML (Windows8, Metro, Windows Store App)

right before I want to say: please do not offer alternative solutions, unless you can execute it without changing the types that have the BaseXXXXXX pattern

that this behavior is beyond bewilderment, as far as I know, it would seem that using the new keyword to hide a property in C # means that WinRT XAML (Windows8, Metro, Windows Store app) bindings no longer function correctly. I have no idea why this is.

Here is an example:

WITH#

 namespace WinRtSandbox { public class BaseClass { public string Property1 { get; set; } public int[] Property2 { get; set; } public object Property3 { get; set; } } public class ModifiedClass : BaseClass { public new string Property1 { get; set; } public new long[] Property2 { get; set; } public new string Property3 { get; set; } } public sealed partial class MainPage : Page { public BaseClass Normal { get; set; } public ModifiedClass Modified { get; set; } public MainPage() { this.Normal = new BaseClass { Property1 = "WTF", Property2 = new[] { 2, 3, 4 }, Property3 = "Work?" }; this.Modified = new ModifiedClass { Property1 = "WTF", Property2 = new[] { 2L, 3L, 4L }, Property3 = "Work?" }; this.InitializeComponent(); } } } 

WinRT XAML:

 <Page x:Class="WinRtSandbox.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:WinRtSandbox" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" DataContext="{Binding RelativeSource={RelativeSource Self}}" mc:Ignorable="d"> <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> <Border Background="#22000000" Padding="40" Width="400" Height="500"> <Grid> <Grid.Resources> <Style TargetType="Rectangle"> <Setter Property="Height" Value="1"/> <Setter Property="HorizontalAlignment" Value="Stretch"/> <Setter Property="Margin" Value="0,15,0,15"/> <Setter Property="Fill" Value="{StaticResource ApplicationForegroundThemeBrush}"/> </Style> </Grid.Resources> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <StackPanel Grid.Column="0"> <ItemsControl> <TextBlock Text="this.Normal"/> <Rectangle/> <TextBlock Text="this.Normal.Property1"/> <Rectangle/> <TextBlock Text="this.Normal.Property2"/> <Rectangle/> <TextBlock Text="this.Normal.Property3"/> </ItemsControl> <Rectangle Fill="Red"/> <ItemsControl> <TextBlock Text="this.Modified"/> <Rectangle/> <TextBlock Text="this.Modified.Property1"/> <Rectangle/> <TextBlock Text="this.Modified.Property2"/> <Rectangle/> <TextBlock Text="this.Modified.Property3"/> </ItemsControl> </StackPanel> <StackPanel Grid.Column="1"> <ItemsControl DataContext="{Binding Normal}"> <TextBlock Text="{Binding}"/> <Rectangle/> <TextBlock Text="{Binding Property1}"/> <Rectangle/> <TextBlock Text="{Binding Property2}"/> <Rectangle/> <TextBlock Text="{Binding Property3}"/> </ItemsControl> <Rectangle Fill="Red"/> <ItemsControl DataContext="{Binding Modified}"> <TextBlock Text="{Binding}"/> <Rectangle/> <TextBlock Text="{Binding Property1}"/> <Rectangle/> <TextBlock Text="{Binding Property2}"/> <Rectangle/> <TextBlock Text="{Binding Property3}"/> </ItemsControl> </StackPanel> </Grid> </Border> </Grid> </Page> 

A too wrong result looks something like this: what is going on

in principle, each of these blank lines should be filled. . Any of you XAML hot dogs have an idea why these bindings fail, and is there anything that can be done to get around what I can only suppose is a disgusting mistake? Any help or understanding would be greatly appreciated, thanks in advance ... -ck

update: forgot dump output

 Error: BindingExpression path error: 'Property2' property not found on 'WinRtSandbox.ModifiedClass'. BindingExpression: Path='Property2' DataItem='WinRtSandbox.ModifiedClass'; target element is 'Windows.UI.Xaml.Controls.TextBlock' (Name='null'); target property is 'Text' (type 'String') Error: BindingExpression path error: 'Property3' property not found on 'WinRtSandbox.ModifiedClass'. BindingExpression: Path='Property3' DataItem='WinRtSandbox.ModifiedClass'; target element is 'Windows.UI.Xaml.Controls.TextBlock' (Name='null'); target property is 'Text' (type 'String') 

Update:

Error filed with Microsoft: https://connect.microsoft.com/VisualStudio/feedback/details/782993/binding-a-property-that-hides-another-in-winrt-xaml , so we will see how this happens

+6
source share
2 answers

It turns out that this is an “unsupported error”, whatever that means ... Here is a direct quote:

Hi, sorry for our late reply. While we do not support this error. go to http://support.microsoft.com or call 1-800-MICROSOFT for help. Thanks.

... hope this will be fixed in .NET 4.5.1

view error report: https://connect.microsoft.com/VisualStudio/feedback/details/782993/binding-a-property-that-hides-another-in-winrt-xaml

0
source

I agree that this is a mistake.

I know you said you don’t want alternatives, but for the sake of someone who could read this question, I will ignore you.

You can fix this by doing all the properties in DependencyProperty

 public class BaseClass : DependencyObject { public static readonly DependencyProperty Property1Property = DependencyProperty.Register( "Property1", typeof(string), typeof(BaseClass), new PropertyMetadata(null)); public string Property1 { get { return (string)GetValue(Property1Property); } set { SetValue(Property1Property, value); } } public static readonly DependencyProperty Property2Property = DependencyProperty.Register( "Property2", typeof(int[]), typeof(BaseClass), new PropertyMetadata(null)); public int[] Property2 { get { return (int[])GetValue(Property2Property); } set { SetValue(Property2Property, value); } } public static readonly DependencyProperty Property3Property = DependencyProperty.Register( "Property3", typeof(object), typeof(BaseClass), new PropertyMetadata(null)); public object Property3 { get { return GetValue(Property3Property); } set { SetValue(Property3Property, value); } } } public class ModifiedClass : BaseClass { public static readonly new DependencyProperty Property1Property = DependencyProperty.Register( "Property1", typeof(string), typeof(ModifiedClass), new PropertyMetadata(null)); public new string Property1 { get { return (string)GetValue(Property1Property); } set { SetValue(Property1Property, value); } } public static readonly new DependencyProperty Property2Property = DependencyProperty.Register( "Property2", typeof(long[]), typeof(ModifiedClass), new PropertyMetadata(null)); public new long[] Property2 { get { return (long[])GetValue(Property2Property); } set { SetValue(Property2Property, value); } } public static readonly new DependencyProperty Property3Property = DependencyProperty.Register( "Property3", typeof(string), typeof(ModifiedClass), new PropertyMetadata(null)); public new string Property3 { get { return (string)GetValue(Property3Property); } set { SetValue(Property3Property, value); } } } 
+1
source

All Articles