2011-09-27 5 views
2

나는 8 개의 열을 가지고 있고 모두 동일한 datacontext를 가지고있다.xaml을 리소스로 전송

<!-- COLUMN: PREVIEW MESSAGE --> 
        <data:DataGridTemplateColumn x:Name="PreviewColumn" CanUserSort="True" 
              SortMemberPath="Preview" Width="*"> 
         <data:DataGridTemplateColumn.CellTemplate> 

          <DataTemplate> 
           <TextBlock Text="{Binding Preview}" 
             FontWeight="{Binding IsBold, Converter={StaticResource cnvFontWeight}}" 
             Foreground="{Binding IsOverdueMessage, Converter={StaticResource cnvOverdue}}" 
             VerticalAlignment="Center" 
             Margin="5,0,5,0"> 
           <telerik:RadContextMenu.ContextMenu> 
            <telerik:RadContextMenu Opened="inboxContextMenu_Opened" ItemClick="inboxContextMenu_ItemClick"> 
             <telerik:RadMenuItem Header="Forward message" Loaded="ForwardMessageMenuItem_Loaded"/> 
                                </telerik:RadContextMenu> 
           </telerik:RadContextMenu.ContextMenu> 
           </TextBlock> 
          </DataTemplate> 

         </data:DataGridTemplateColumn.CellTemplate> 

        </data:DataGridTemplateColumn> 

이 컨텍스트 메뉴를 재사용 할 수있는 가장 효과적인 방법은 무엇입니까? 그것은 모든 열에 동일합니다. 나는 실버 라이트에서 많은 경험이 없다. 저는 실버 라이트 4를 사용하고 있습니다.

+0

전체 DataTemplate이 동일하거나 ContextMenu 만 있습니까? 문맥 메뉴 만 – Mart

+0

. 모든 열은 다른 바인딩을가집니다. – user278618

+0

안녕하세요,이 질문을 잊어 버렸습니까? –

답변

1

처음에는 TextBlock을위한 특정 스타일을 만든 다음 스타일 안에 ContextMenu를 넣을 수 있다고 생각했습니다. 그러나 TextBlock은 ContentControl에서 상속되지 않으므로 간단히 수행 할 수 없습니다.

그러면 할 수있는 일은 TextBlock 대신 Label을 사용하는 것입니다. SDK를 네임 스페이스를 포함하면,

의 xmlns를 이런 식으로 뭔가를 할 것이다 : SDK = "http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"

<sdk:Label Content="{Binding Preview}" 
       FontWeight="{Binding IsBold, Converter={StaticResource cnvFontWeight}}" 
       Foreground="{Binding IsOverdueMessage, Converter={StaticResource cnvOverdue}}" 
       VerticalAlignment="Center" 
       Margin="5,0,5,0" 
       Style="{StaticResource LabelWithContextMenuStyle}"/> 

이 Label 컨트롤에 스타일을 지정했는지 확인할 수 있습니다.

이 스타일은 기본적으로 Label의 기본 스타일로 ContentControl 내에 추가 ContextMenu가 있습니다.

<Style x:Key="LabelWithContextMenuStyle" TargetType="sdk:Label"> 
     <Setter Property="IsTabStop" Value="False"/> 
     <Setter Property="HorizontalContentAlignment" Value="Left"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="sdk:Label"> 
        <Grid> 
         <VisualStateManager.VisualStateGroups> 
          <VisualStateGroup x:Name="CommonStates"> 
           <VisualState x:Name="Normal"/> 
           <VisualState x:Name="Disabled"/> 
          </VisualStateGroup> 
          <VisualStateGroup x:Name="ValidationStates"> 
           <VisualState x:Name="Valid"/> 
           <VisualState x:Name="Invalid"> 
            <Storyboard> 
             <ObjectAnimationUsingKeyFrames Duration="0:0:1.5" Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentControl"> 
              <DiscreteObjectKeyFrame KeyTime="0"> 
               <DiscreteObjectKeyFrame.Value> 
                <SolidColorBrush Color="Red"/> 
               </DiscreteObjectKeyFrame.Value> 
              </DiscreteObjectKeyFrame> 
             </ObjectAnimationUsingKeyFrames> 
            </Storyboard> 
           </VisualState> 
          </VisualStateGroup> 
          <VisualStateGroup x:Name="RequiredStates"> 
           <VisualState x:Name="NotRequired"/> 
           <VisualState x:Name="Required"> 
            <Storyboard> 
             <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="FontWeight" Storyboard.TargetName="ContentControl"> 
              <DiscreteObjectKeyFrame KeyTime="0" Value="SemiBold"/> 
             </ObjectAnimationUsingKeyFrames> 
            </Storyboard> 
           </VisualState> 
          </VisualStateGroup> 
         </VisualStateManager.VisualStateGroups> 
         <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="2" Padding="{TemplateBinding Padding}"> 
          <ContentControl x:Name="ContentControl" Cursor="{TemplateBinding Cursor}" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" FontWeight="{TemplateBinding FontWeight}" FontStretch="{TemplateBinding FontStretch}" FontSize="{TemplateBinding FontSize}" FontFamily="{TemplateBinding FontFamily}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" IsTabStop="False" VerticalAlignment="{TemplateBinding VerticalAlignment}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" Margin="131,106,0,0"> 
           <telerik:RadContextMenu.ContextMenu> 
            <telerik:RadContextMenu Opened="RadContextMenu_Opened" ItemClick="RadContextMenu_ItemClick"> 
             <telerik:RadMenuItem Loaded="RadMenuItem_Loaded"/> 
            </telerik:RadContextMenu> 
           </telerik:RadContextMenu.ContextMenu> 
          </ContentControl> 
         </Border> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

이것은 그 것이다. 이게 도움이 되길 바란다. :)

관련 문제