2014-11-18 5 views
0

Я скопировал некоторый ресурс о пользовательской кнопке с помощью Content control. И я что-то изменилось, чтобы быть <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContentControl},Path=Content}"> Для dataTempalteКак использовать содержимое WPF ContentControl с помощью DataTemplate

<DataTemplate x:Key="PriceDataTemplate" DataType="m:ClickTradeViewModel"> 
    <Button Command="{Binding ExecuteCommand}" Cursor="Hand"> 
     <Button.Style> 
      <Style TargetType="Button"> 
       <Setter Property="Background" Value="Transparent" /> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="Button"> 
          <Border Background="{TemplateBinding Background}"> 
           <ContentPresenter Content="{TemplateBinding Content}" /> 
          </Border> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
       <Style.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Background" Value="DarkGray" /> 
        </Trigger> 
        <Trigger Property="IsPressed" Value="True"> 
         <Setter Property="Background" Value="#FF345C8B" /> 
        </Trigger> 
        <DataTrigger Binding="{Binding IsExecuting}" Value="True"> 
         <Setter Property="Background" Value="DimGray" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Button.Style> 

     <UserControl> 
      <UserControl.Template> 
       <ControlTemplate TargetType="UserControl"> 
        <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContentControl},Path=Content}"></TextBlock> 
       </ControlTemplate> 
      </UserControl.Template> 
     </UserControl> 
    </Button> 
</DataTemplate> 

И для фактического Баттона, он использовал

<ContentControl x:Name="AskContentControl" Grid.Column="2" 
       Margin="5,0,0,0" 
       Content="{Binding QQ.Bid}" 
       ContentTemplate="{StaticResource PriceDataTemplate}"/> 

Я ожидаю, что Content будет использовать double Bid «ы tostring метод для отображения контента, но ничего не отображается внутри (серый цвет). На графике левая сторона показывает, что цена действительно существует.

enter image description here

Update: Я не уверен, что происходит, но с некоторыми изменениями <TextBlock Text="{Binding QQ.Ask}"></TextBlock> и установить

<ContentControl x:Name="AskContentControl" Grid.Column="2" 
       Margin="5,0,0,0" 
       Content="{Binding}" 
       ContentTemplate="{StaticResource PriceDataTemplate}"/> makes it work. 

Проблема заключается в том, то я должен был явно установить PriceDataTemplate несколько раз для различных свойства.

ответ

1

Это не работает, потому что вы используете связывание с RelativeSource находя ContentControl но UserControl также ContentControl, так что он нашел это на самом деле UserControl, не корень ContentControl вы думали. В этом случае вы можете указать некоторые AncestorLevel в 2 (чтобы найти второй ContentControl):

<TextBlock Text="{Binding 
      RelativeSource={RelativeSource Mode=FindAncestor, 
          AncestorType=ContentControl, AncestorLevel=2}, 
      Path=Content}"></TextBlock> 

Однако это не совсем безопасно, и в этом случае неявной DataContext на самом деле Content вы установили для ContentControl (эта DataContext потоков вниз от DataTemplate через шаблон UserControl). Таким образом, связывание может быть только простым, как это:

<TextBlock Text="{Binding}"></TextBlock> 

Примечание Я должен вам сохранить настройки содержания в ContentControl к {Binding QQ.Bid}.

+0

Второй простой способ работы! Но использование 'AncestorLevel' только делает результат' Windows.Controls'. – baozi

0

Это полное рабочее решение ... Я опаздываю, но, возможно, это может помочь другим?

<UserControl 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:ParametricStudyAnalysis.ScopeSelection.Special" 
      xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid" x:Class="ParametricStudyAnalysis.ScopeSelection.Special.UserControlAddSpecialSignal" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <UserControl.DataContext> 
     <local:UserControlAddSpecialSignalModel></local:UserControlAddSpecialSignalModel> 
    </UserControl.DataContext> 

    <UserControl.Resources> 
     <DataTemplate DataType="{x:Type local:UserControlSpecialSignalTtrModel}"> 
      <local:UserControlSpecialSignalTtr/> 
     </DataTemplate>  
    </UserControl.Resources> 

    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition></RowDefinition> 
     </Grid.RowDefinitions> 


     <GroupBox Header="Signal type" Grid.Row="0" Padding="5"> 
      <xcdg:DataGridControl Name="DataGrid" SelectionMode="Single" ItemsSource="{Binding SpecialSignalEntries}" 
           SelectedItem="{Binding SpecialSignalEntrySelected}" Height="200"> 
      <xcdg:DataGridControl.Columns> 
       <xcdg:Column FieldName="Name" Title="Type of special signal" ReadOnly="True"></xcdg:Column> 
      </xcdg:DataGridControl.Columns> 
     </xcdg:DataGridControl> 
     </GroupBox> 

     <GroupBox Header="Parameters" Grid.Row="1" Margin="0,3,0,0" Padding="5"> 
      <ContentControl Name="MyContentControl" 
          DataContext="{Binding SpecialSignalEntrySelected, Mode=OneWay}" 
          Content="{Binding SignalProviderSpecial}"> 
      </ContentControl> 
     </GroupBox> 
    </Grid> 
</UserControl> 
Смежные вопросы