C# WPF-如何重用单个对象的数据模板进行收集?

C# WPF-如何重用单个对象的数据模板进行收集?,c#,wpf,xaml,C#,Wpf,Xaml,当我为我的应用程序创建数据类型-控件映射时,我发现使用ContentPresenter和数据模板是可行的。我已经成功地做到了这一点。对于这个代码段,我包含了System.String数据类型的映射。但是,我注意到,如果我绑定了一个字符串列表并为其映射了一个通用集合控件,那么这些字符串将表示为一个文本框,而不仅仅是一个普通字符串,如下图所示(请参见StringCollection) 现在,我希望使用这个杠杆,以便在为DynamicPropertyValue分配集合时重用控件。如何实现文本框的多重

当我为我的应用程序创建数据类型-控件映射时,我发现使用ContentPresenter和数据模板是可行的。我已经成功地做到了这一点。对于这个代码段,我包含了System.String数据类型的映射。但是,我注意到,如果我绑定了一个字符串列表并为其映射了一个通用集合控件,那么这些字符串将表示为一个文本框,而不仅仅是一个普通字符串,如下图所示(请参见StringCollection)

现在,我希望使用这个杠杆,以便在为DynamicPropertyValue分配集合时重用控件。如何实现文本框的多重绑定?如果PropertyValue是数组,则绑定到其元素;else绑定到PropertyValue本身

<DataTemplate>
    <StackPanel x:Name="ItemStackPanel" Orientation="Horizontal" Margin="8">
        <TextBlock Text="{Binding PropertyName}" FontSize="14" MinWidth="120"
            Validation.ErrorTemplate="{x:Null}">
        </TextBlock>
        <ContentPresenter Margin="48, 0, 0, 0" Content="{Binding PropertyValue}">
            <ContentPresenter.Resources>
                <DataTemplate DataType="{x:Type System:String}">
                    <TextBox Text="{Binding ElementName=ItemStackPanel, Path=DataContext.PropertyValue}" 
                        Width="100" Validation.ErrorTemplate="{StaticResource ErrorTemplate}">
                    </TextBox>
                </DataTemplate>
                <DataTemplate DataType="{x:Type dataTypes:StringCollection}">
                    <controls:GenericCollectionControl x:Name="GenericCollectionControl"
                        ItemsSource="{Binding ElementName=ItemStackPanel, Path=DataContext.PropertyValue}"
                        Validation.ErrorTemplate="{StaticResource ErrorTemplate}">
                    </controls:GenericCollectionControl>
                </DataTemplate>
            </ContentPresenter.Resources>
        </ContentPresenter>
    </StackPanel>
</DataTemplate>

---修订1---

我通过使用IMultiValueConverter并返回正确的绑定,成功地使其工作

<TextBox Width="100" Validation.ErrorTemplate="{StaticResource ErrorTemplate}">
    <TextBox.Text>
        <MultiBinding Converter="{StaticResource BindingSelector}">
            <Binding Mode="OneWay"></Binding>
            <Binding ElementName="ItemStackPanel" Path="DataContext.PropertyValue"></Binding>
        </MultiBinding>
    </TextBox.Text>
</TextBox>

但是如果绑定模式不是单向的,我有一个例外。我如何实现双向绑定

但是如果绑定模式不是单向的,我有一个例外。我如何实现双向绑定

尝试为第一个绑定指定路径:

<TextBox Width="100" Validation.ErrorTemplate="{StaticResource ErrorTemplate}">
    <TextBox.Text>
        <MultiBinding Converter="{StaticResource BindingSelector}">
            <Binding Path="." />
            <Binding ElementName="ItemStackPanel" Path="DataContext.PropertyValue"></Binding>
        </MultiBinding>
    </TextBox.Text>
</TextBox>

Path=“”是什么意思?这意味着您正在绑定到DataContext本身,我相信这就是您案例中的字符串。双向绑定需要显式路径。