0

我正在尝试为 ListBox 项制作一个复杂的模板,但某些绑定不起作用或“双向绑定需要 Path 或 XPath”。发生异常。

我在 CustomerViewModel 的 ObservableCollection 上有一个 ListBox 绑定。ListBox 中的每一项都必须显示 CustomerViewModel 对象的两个属性。第一个是“名称”(类型 - 字符串),第二个是“值”(类型 - 对象)。“Value”的真实类型可以是: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 回答