【问题标题】:Access properties of elements defined in ControlTemplate in xaml访问 xaml 中 ControlTemplate 中定义的元素的属性
【发布时间】:2013-09-04 20:55:16
【问题描述】:

在我的 xaml 中,我必须将 10 个项目定义为:

<StackPanel Orientation="Horizontal" Grid.Row="0" Grid.Column="1">
  <TextBox Width="100"
           DataContext="{StaticResource dataProvider}"
           Text="{Binding XPath='BLOCK[@id=2]/ITEMS/ITEM[@id=1]/@value'}"/>
  <ComboBox Margin="5" 
            DataContext="{StaticResource dataProvider}"
            SelectedValuePath="Tag"
            SelectedValue="{Binding XPath='BLOCK[@id=2]/ITEMS/ITEM[@id=2]/@value'}">
    <ComboBoxItem Content="GROUP" Tag="6" />
    <ComboBoxItem Content="PRIVATE" Tag="5" />
  </ComboBox>            
  <TextBox Width="200"
           DataContext="{StaticResource dataProvider}"
           Text="{Binding XPath='BLOCK[@id=2]/ITEMS/ITEM[@id=4]/@value'}"/>
</StackPanel>

所以,我没有重复多次,而是想使用这样的 ControlTemplate:

<DataTemplate.Resources>
  <ControlTemplate x:Key="AddressItemTemplate">
    <StackPanel Orientation="Horizontal">
      <TextBox Name="Address" Width="200"/>
      <ComboBox Name="Type">
        <ComboBoxItem Content="GROUP" Tag="6" />
        <ComboBoxItem Content="PRIVATE" Tag="5" />
      </ComboBox>
      <TextBox Name="Description" Width="200"/>
    </StackPanel>
  </ControlTemplate>      
</DataTemplate.Resources>

现在当我使用它时...

<Control Grid.Row="0" Grid.Column="1" Template="{StaticResource AddressItemTemplate}" />
<Control Grid.Row="1" Grid.Column="1" Template="{StaticResource AddressItemTemplate}" />
<Control Grid.Row="2" Grid.Column="1" Template="{StaticResource AddressItemTemplate}" />

.. 由于每个项目的 XPath 绑定属性不同(ITEM[@Id] 总是更改),因此我需要一种方法来在创建时访问 TextBox.Text、ComboBox.SelectedValuePath 和 ComboBox.SelectedValue 属性控制”。

有办法吗?

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    这是 WPF 中一个非常常见的问题。如果您将 Control control 命名为这样,则可以访问这些元素:

    TextBox textBox = (TextBox)control.Template.FindName("Address", control);
    
    ComboBox comboBox = (ComboBox)control.Template.FindName("Type", control);
    

    我相信您可以自己解决剩下的问题。

    【讨论】:

    • 嗨@sheridan,感谢您的回复。我忘了提到我需要一种方法来访问同一个 xaml 文件中的这些道具,而不是从代码中。
    • 那么答案是'不,你不能那样做'。您只需要声明几个 ControlTemplate 对象或 UserControl 将这些属性公开为 Dependency Properties...然后您将能够从您的 @987654327 绑定到它们@.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 2011-08-12
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多