2

添付プロパティを ComboBox の DisplayMemberPath として使用できるようにするための正しい構文が見つからないようです。

プロパティは SelectorSwitchedControl.NameForSelector
です。これは、XAML プレフィックス 'local' にマップされている名前空間 'LocalTest' にあります。

これがコードです...

<UserControl x:Class="Playground.SelectorSwitchedControlTest.SelectorSwitchedControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:glc="clr-namespace:Playground.CommonControls"
    xmlns:local="clr-namespace:Playground.SelectorSwitchedControlTest"
    Background="Transparent">

    <Border x:Name="MainBorder"
        BorderBrush="Gray" BorderThickness="1">

        <DockPanel>

            <glc:FixedToolBar DockPanel.Dock="Top">

                <ComboBox x:Name="MainSelector"
                    ItemsSource="{Binding Children, ElementName=MainPanel}"
                    DisplayMemberPath="(local:SelectorSwitchedControl.NameForSelector)" />

            </glc:FixedToolBar>

            <local:SelectorSwitchedControlPanel x:Name="MainPanel" />

        </DockPanel>

    </Border>

</UserControl>

...何らかの理由で、「プレフィックス「ローカル」は名前空間にマップされません」という例外が発生します。「DisplayMemberPath」行を削除したかのように、「」タグは、名前空間がマップされていることを証明するはずのようにレンダリングされると言っている理由がわかりません。

また、次のすべてを試しました...

  • DisplayMemberPath="local:SelectorSwitchedControl.NameForSelector"
  • DisplayMemberPath="(local:SelectorSwitchedControl.NameForSelector)"
  • DisplayMemberPath="SelectorSwitchedControl.NameForSelector"
  • DisplayMemberPath="(SelectorSwitchedControl.NameForSelector)"
  • DisplayMemberPath="LocalTest.SelectorSwitchedControl.NameForSelector"
  • DisplayMemberPath="(LocalTest.SelectorSwitchedControl.NameForSelector)"

頭が働かず、単純なものが欠けている日々の 1 つであることはわかっていますが、気が狂ってしまいます! では、適切な構文は何ですか?

4

3 に答える 3

1

DisplayMemberPath通常のコントロールで添付プロパティを使用することは不可能だと思います。その理由は、使用しているプロパティ パスが、XAML で宣言された XML 名前空間を参照しているためです。通常、添付プロパティの構文を使用すると、XAML/BAML リーダーがオブジェクトを作成しているときにパーサー コンテキストが使用可能になり、このコンテキストが名前空間情報を提供します。ただしDisplayMemberPath、 は単なる文字列であり、このコンテキストをキャプチャしないため、バインディングを作成するためにプロパティ パスが実際に使用される時点で、このコンテキストを使用して名前空間情報を提供することはできません。PresentationFramework.dllのコードを読んだところ、適切IServiceProviderIXamlTypeResolver(関連するコードは から始まりますPropertyPath.GetTypeFromName)。

安価な代替手段として、 の代わりにテンプレートまたはテンプレート セレクターを検討してくださいDisplayMemberPath。デフォルトのルックアップ メカニズムを使用する場合は、次のような方法を試してください。

<ItemTemplate>
  <DataTemplate>
    <ContextPresenter 
      Content="{Binding (local:SelectorSwitchedControl.NameForSelector)}"/>
  </DataTemplate>
</ItemTemplate>
于 2013-10-30T22:03:45.393 に答える
0

正しい値は

DisplayMemberPath="(local:SelectorSwitchedControl.NameForSelector)"

それが機能しない場合は、Snoop ( http://snoopwpf.codeplex.com/ ) を使用して、値が正しく設定されていることを確認します。

これが最も簡単な作業例です

Xaml:

<Window x:Class="WPFTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WPFTest"
    Title="MainWindow" Height="350" Width="525" Loaded="MainWindow_Loaded">
<Grid>
    <ComboBox Name="cb" DisplayMemberPath="(local:MainWindow.TestValue)" />
</Grid>

コード:

public static string GetTestValue(DependencyObject element)
    {
        return (string)element.GetValue(TestValueProperty);
    }

    public static void SetTestValue(DependencyObject element, string value)
    {
        element.SetValue(TestValueProperty, value);
    }

    public static readonly DependencyProperty TestValueProperty = DependencyProperty.RegisterAttached("TestValue", typeof(string), typeof(MainWindow), new FrameworkPropertyMetadata(null));

    private void MainWindow_Loaded(object sender, System.Windows.RoutedEventArgs e)
    {
        TextBlock tb = default(TextBlock);


        for (int i = 10; i <= 15; i++)
        {
            tb = new TextBlock();
            tb.Text = "Text for " + i;
            tb.SetValue(TestValueProperty, "Property For " + i);
            this.cb.Items.Add(tb);
        }
    }
于 2013-10-30T21:17:16.700 に答える