如何从我的控件中获取当前的DataContext



我有一个列表框,其中包含我要开发的控制选择器。基本上,数据源是XML,我想读取当前上下文以确定要显示的元素控件。

为此,我想用当前项目的上下文来获取XMLDATAPROVIDER,然后评估XML。在XAML中,我会编写{binding Path =@label}以从Curretn XML元素检索标签属性。从后面的代码中,我什至无法弄清楚该XML的位置,因为它通过列表控件传递给了该控件,但据我所知,它都不是可访问的属性。

无论如何获得@label不够;我想要类ControlChooser中的XMLELEMENT对象,在下面实例化。

 <ListBox 
  IsSynchronizedWithCurrentItem="True"
  ItemsSource="{Binding XPath=*[not(self::units)]}"
  >
  <ListBox.ItemTemplate>
    <DataTemplate>
      <W3V:ControlChooser/>
    </DataTemplate>
  </ListBox.ItemTemplate>
  <ListBox.ItemContainerStyle>
    <!-- Force the items to fill all available space. -->
    <Style TargetType="ListBoxItem">
      <Setter 
        Property="VerticalContentAlignment" 
        Value="Stretch" 
        />
    </Style>
  </ListBox.ItemContainerStyle>
</ListBox>

或,如果您可以建议另一种方法来获取工作(切换显示的控件)....

您可以使用多个 DataTemplate s对不同的元素类型进行样式。如果您熟悉XSLT,则DataTemplate S是xsl:template的功能等效。

样式的示例:

<Window x:Class="ZoomingScrollViewer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <XmlDataProvider x:Key="testData" XPath="/Contacts/*">
            <x:XData>
                <Contacts xmlns="">
                    <Person Name="John" />
                    <Person Name="Robby" />
                    <Business>
                        <ContactName>Jemma</ContactName>
                        <BusinessName>Ars</BusinessName>
                    </Business>
                    <Business>
                        <BusinessName>The other one</BusinessName>
                    </Business>
                </Contacts>
            </x:XData>
        </XmlDataProvider>
    </Window.Resources>
    <Grid>
        <ListBox ItemsSource="{Binding Source={StaticResource testData}}">
            <ListBox.Resources>
                <DataTemplate DataType="Person">
                    <TextBlock Text="{Binding XPath=@PersonName}" />
                </DataTemplate>
                <DataTemplate DataType="Business">
                    <StackPanel>
                        <TextBlock Text="{Binding XPath=ContactName}" />
                        <TextBlock Text="{Binding XPath=BusinessName}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.Resources>
        </ListBox>
    </Grid>
</Window>

如果要选择基于属性而不是元素的DataTemplate,则可以使用DataTemplateSelector来运行此问题所述的任意代码。

我找到了"基于成员变量的不同视图/数据模板",这是最接近答案的。有了这个想法,我可以做出一个独立的控制,对我来说很有意义。这是关键位:

  <DataTrigger Binding="{Binding XPath=@kind}" Value="Number">
     <Setter Property="ContentTemplate" Value="{StaticResource SmallInt}" />
  </DataTrigger>

这是整个控件:

<ContentControl
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:W3V="clr-namespace:W3.Views"
             x:Class="W3.Views.ControlChooser">
  <ContentControl.Resources>
    <DataTemplate x:Key="StringChoice" >
      <W3V:ComboView />
    </DataTemplate>
    <DataTemplate x:Key="SmallInt" >
      <W3V:SpinView />
    </DataTemplate>
  </ContentControl.Resources>
  <ContentControl.Style>
      <Style TargetType="{x:Type ContentControl}">
        <Setter Property="ContentTemplate" Value="{StaticResource StringChoice}" />
        <Style.Triggers>
          <DataTrigger Binding="{Binding XPath=@kind}" Value="Number">
            <Setter Property="ContentTemplate" Value="{StaticResource SmallInt}" />
          </DataTrigger>
        </Style.Triggers>
      </Style>
    </ContentControl.Style>
</ContentControl>

最新更新