无法将内容控件绑定到与包含数据模板的列表框相同的列表

时间:2017-01-06 02:19:16

标签: c# wpf xaml mvvm

我正在编写一个编辑器,它在用户控件左侧的列表框中显示参数列表,并在右侧显示详细信息。有6种不同类型的参数,每种参数都有自己的一组值。列表框使用DataTemplate显示每个参数类型。我希望编辑在右侧类似地工作,这样当选择列表框中的参数时,右侧会加载相应的模板。以下缩写的XAML代码用于显示左侧列表框,但无法在右侧显示任何内容,除了单词' collection'。参数是带有参数列表的ObservableCollection。我试图在内容提供程序资源中使用一组xaml代码来执行此操作,但切换到此Microsoft文章中建议的技术:Simple Navigation Technique in WPF using MVVM。但是,这也给出了完全相同的结果。当选择列表中的项目时,ContentControl应显示相应的UserControl,但不显示任何内容。屏幕截图应该在所选参数的右侧显示自定义控件,而不是单词' Collection'。 Snapshot of incorrect control

有什么建议吗?

    <DockPanel Grid.Row="1" DataContext="{Binding Parameters}">
        <ListBox DockPanel.Dock="Left" MinWidth="250" 
                 ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" 
                 SelectedItem="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=DataContext.SelectedParameter}"
                 Margin="0,0,15,0" HorizontalAlignment="Left">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Image Source="{Binding Path=Icon}" Stretch="None" />
                        <TextBlock Text="{Binding Position}" Margin="10,0,0,0" />
                        <TextBlock Text="{Binding Name}" Margin="10,0,0,0" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <ContentControl Content="{Binding}">
            <ContentControl.Resources>
                <DataTemplate x:Key="InputParameterTemplate" DataType="x:Type local:ParameterDisplayLineInput">
                    <controls:EditInputParameter />
                </DataTemplate>
                <DataTemplate x:Key="OutputParameterTemplate" DataType="x:Type local:ParameterDisplayLineOutput">
                    <controls:EditOutputParameter />
                </DataTemplate>
                <DataTemplate x:Key="LogicParameterTemplate"  DataType="x:Type local:ParameterDisplayLineLogic">
                    <controls:EditLogicParameter />
                </DataTemplate>
                <DataTemplate x:Key="TableParameterTemplate"  DataType="x:Type local:ParameterDisplayLineTable">
                    <controls:EditTableParameter />
                </DataTemplate>
                <DataTemplate x:Key="TimerParameterTemplate"  DataType="x:Type local:ParameterDisplayLineTimer">
                    <controls:EditTimerParameter />
                </DataTemplate>
                <DataTemplate x:Key="NetworkListParameterTemplate"  DataType="x:Type local:ParameterDisplayLineNetworkList">
                    <controls:EditNetworkListParameter />
                </DataTemplate>
            </ContentControl.Resources>
        </ContentControl>
    </DockPanel>

2 个答案:

答案 0 :(得分:1)

丢失“x:Key”,因此您的DataTemplate将自动应用。 (我猜你有适当的约束力)

if(null != slide.video){
    // add code for video
  }
else if(null != slide.blog){
    // add code for blog
  }
else if (null != slide.advertisement){
    // add code for advertisement
  }

答案 1 :(得分:0)

我最终撑了这个。我在参数显示行模型类中直接欺骗并存储了指向相应编辑行用户控件的指针,然后将内容控件绑定到该控件。我无法找到内容控件自动更改为特定行的正确数据模板。请不要指出这违反了UI与模型的分离 - 我知道并让我头晕目眩,但没有其他工作。