6

前もって言いたいのは、パターン BaseXXXXXX のタイプを変更せずにそれを達成できない限り、代替ソリューションを提案しないでください

とはいえ、この動作は、私に関する限り、当惑をはるかに超えていnewます。C# でプロパティを非表示にするためにキーワードを使用すると、WinRT XAML (Windows8、Metro、Windows ストア アプリ) バインディングが正しく機能しなくなることを意味するようです。これがなぜなのかわかりません。

次に例を示します。

C#:

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>

まったく不正確な結果は次のようになります。 何が起こっている

基本的に、これらの空白行のすべてを埋める必要があります。XAML ホットショットのいずれかが、これらのバインディングが失敗する理由を理解していますか?また、凶悪なバグであるとしか考えられないものを回避するためにできることはありますか? 事前に感謝します... -ck

更新:忘れていた出力ダンプ

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')

アップデート:

Microsoft に提出されたバグ: https://connect.microsoft.com/VisualStudio/feedback/details/782993/binding-a-property-that-hides-another-in-winrt-xaml

4

2 に答える 2

1

バグのように見えることに同意します。

あなたが代替案を望んでいないと言ったのは知っていますが、この質問を読む可能性のある他の誰かのために、私はあなたを無視します.

これを修正するには、プロパティをそれぞれ 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); }
    }
}
于 2013-05-04T22:04:00.117 に答える
0

これが意味するものは何でも「サポートされていないバグ」であることが判明しました...ここに直接の引用があります:

こんにちは、返信が遅くなり申し訳ありません。現在のところ、このバグはサポートされていません。http://support.microsoft.comにアクセスするか、1-800-MICROSOFT に電話してサポートを受けてください。ありがとう。

...うまくいけば、これは.NET 4.5.1で修正されるでしょう

バグ レポートを表示: https://connect.microsoft.com/VisualStudio/feedback/details/782993/binding-a-property-that-hides-another-in-winrt-xaml

于 2013-06-27T19:40:10.807 に答える