0

ListBox アイテムの複雑なテンプレートを作成しようとしていますが、一部のバインディングが機能しないか、「双方向バインディングにはパスまたは XPath が必要です」。例外が発生しました。

CustomerViewModel の ObservableCollection に ListBox バインディングがあります。ListBox の各項目は、CustomerViewModel オブジェクトの 2 つのプロパティを表示する必要があります。1 つ目は「名前」(タイプ - 文字列)、2 つ目は「値」(タイプ - オブジェクト) です。「値」の実数型は、bool、int、string、datetime のいずれかです。したがって、表示するコントロール テンプレートは選択可能である必要があります。

「値」プロパティのコード:

    public object Value
    {
        get
        {
            switch (this.info.InputType)
            {
                case Enums.InputType.DateTime:
                    return Convert.ToDateTime(this.info.Value);

                case Enums.InputType.Logical:
                    return Convert.ToBoolean(this.info.Value);

                case Enums.InputType.Numeric:
                    return Convert.ToInt32(this.info.Value);

                case Enums.InputType.Text:
                    return this.info.Value;
            }
            throw new ArgumentOutOfRangeException();
        }
        set
        {
            this.info.Value = value.ToString();
            this.RaisePropertyChanged("Value");
        }
    }

XAML:

<ListBox ItemsSource="{Binding Customers}">
    <ListBox.ItemTemplate>
    <DataTemplate>                           
        <StackPanel>
                    <Label Content="{Binding Name}"/>
                    <ContentControl Content="{Binding Value}">
                        <ContentControl.Resources>
                            <DataTemplate DataType="{x:Type system:String}">
                                <TextBox Text="{Binding}"/>
                            </DataTemplate>
                            <DataTemplate DataType="{x:Type system:Boolean}">
                                <CheckBox IsChecked="{Binding}"/>
                            </DataTemplate>
                            <DataTemplate DataType="{x:Type system:Int32}">
                                <TextBox Text="{Binding}"/>
                            </DataTemplate>
                            <DataTemplate DataType="{x:Type system:DateTime}">
                                <DatePickerTextBox Text="{Binding}"/>
                            </DataTemplate>
                        </ContentControl.Resources>
                    </ContentControl>
                </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

以下の XAML は、「双方向バインディングにはパスまたは XPath が必要です」という例外をスローします。

<ContentControl Content="{Binding Value}">

<TextBox Text="{Binding}"/>

最後の行を次のように変更すると:

<TextBox Text="{Binding Path=.}"/>

..例外はありませんが、バインディングは「OneWay」でしか機能しません。どういうわけか、TextBox を ContentControl と同じプロパティ「Value」にバインドする必要があると思いますが、この場合は TwoWay バインディングを実行できません。

ItemTemplateSelector を書かずにこのようにすることはできますか?

4

1 に答える 1

0

モードを設定して最後の行を試しましたか?

<TextBox Text="{Binding Path=., Mode=TwoWay}"/>

編集

これを使っていることに気づきました。get と this でfieldInfo .Value。セット内のinfo .Value、これは単なるタイプミスですか?

セットに配置されたブレークポイントにヒットできないのですか?

編集

うーん、アイデアが尽きたので、更新元のトリガーを設定してみてはいかがでしょうか?:

<TextBox Text="{Binding Path=., Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
于 2013-07-17T12:00:44.457 に答える