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

时间:2017-03-29 08:16:00

标签: c# wpf xaml

当我为我的应用程序创建数据类型 - 控件映射时,我发现使用ContentPresenter和数据模板是可行的。我成功地做到了。对于此片段,我包含了System.String数据类型的映射。但是,我注意到如果我绑定了一个字符串列表并为它映射了一个泛型集合控件,那么这些字符串就表示为一个TextBox而不是简单的字符串,如下图所示(参见StringCollection)!

enter image description here

现在,我希望使用此杠杆来在动态PropertyValue与集合一起分配时重用控件。如何实现TextBox的多重绑定?如果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>

但如果绑定模式不是单向的话,我会遇到异常。我怎样才能实现这种双向绑定?

1 个答案:

答案 0 :(得分:0)

  

但如果绑定模式不是单向的话,我会遇到异常。我怎样才能实现这种双向绑定?

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

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