2013-11-09 2 views
0

저는 데스크톱 응용 프로그램에서 WPF로 작업하고 있습니다. 내 XAML 코드에서 목록 상자가있는 탭 항목을 만들었습니다. 이제 xaml.cs 파일에서 버튼을 클릭하여 iam에 1 탭을 추가하십시오. 내가 원했던 것은 버튼 클릭시 새로 생성 된 탭에 다른 데이터가있는 목록 상자가 있어야한다는 것입니다. 그래서, 어떻게 생성되는 모든 탭에 대해 비슷한 템플릿을 유지합니까? 모든 탭 항목에 대해 비슷한 스타일 템플릿을 만드는 방법이 있다는 것을 알고 있습니다. 하지만 같은 스타일을 유지하고 싶지는 않지만 데이터 소스를 동적으로 제공 할 동일한 컨트롤을 유지해야합니다. WPF Tabcontrol 모든 탭에 대해 같은 종류의 템플릿

     <DataTemplate x:Key="ValueStyle" > 
          <TextBlock ToolTip="{Binding Path=Value}" VerticalAlignment="Center" Margin="2" Padding="2" Text="{Binding Path=Value}" /> 
         </DataTemplate> 

         <Style x:Key="ExpandCollapseToggleStyle" TargetType="{x:Type ToggleButton}"> 
         <Setter Property="Focusable" Value="False"/> 
         <Setter Property="Width" Value="16"/> 
         <Setter Property="Height" Value="16"/> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="{x:Type ToggleButton}"> 
            <Border Width="16" Height="16" Background="Transparent" Padding="5,5,5,5"> 
             <Path x:Name="ExpandPath" Fill="Transparent" Stroke="#FF989898" Data="M0,0 L0,6 L6,0 z"> 
              <Path.RenderTransform> 
               <RotateTransform Angle="135" CenterX="3" CenterY="3"/> 
              </Path.RenderTransform> 
             </Path> 
            </Border> 
            <ControlTemplate.Triggers> 
             <Trigger Property="IsMouseOver" Value="True"> 
              <Setter TargetName="ExpandPath" Property="Stroke" Value="#FF1BBBFA"/> 
              <Setter TargetName="ExpandPath" Property="Fill" Value="Transparent"/> 
             </Trigger> 

             <Trigger Property="IsChecked" Value="True"> 
              <Setter TargetName="ExpandPath" Property="RenderTransform"> 
               <Setter.Value> 
                <RotateTransform Angle="180" CenterX="3" CenterY="3"/> 
               </Setter.Value> 
              </Setter> 
              <Setter TargetName="ExpandPath" Property="Fill" Value="#FF595959"/> 
              <Setter TargetName="ExpandPath" Property="Stroke" Value="#FF262626"/> 
             </Trigger> 
            </ControlTemplate.Triggers> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </ListBox.Resources> 
       <ListBox.ItemTemplate> 

        <DataTemplate> 

         <StackPanel Orientation="Horizontal" MouseLeftButtonDown="ListItemClicked"> 
         <Border Width="{Binding Path=Level, Converter={StaticResource ConvertLevelToIndent}}" /> 
         <ToggleButton x:Name="tb" ClickMode="Press" IsChecked="{Binding Path=IsExpanded}" Style="{StaticResource ExpandCollapseToggleStyle}"/> 
           <TextBlock FontSize="14" Text="{Binding Path=r1}" Width="100" /> 

           <TextBlock FontSize="14" Text="{Binding Path=r2}" Width="100" /> 


         </StackPanel> 
         <DataTemplate.Triggers> 
          <DataTrigger Binding="{Binding Path=SubKeyCount}" Value="0"> 
           <Setter Property="Visibility" TargetName="tb" Value="Hidden"/> 
          </DataTrigger> 
         </DataTemplate.Triggers> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 

+0

바인딩을 사용할 수 있습니까? –

+0

나는 이미 클래스 변수 r1과 r2에 데이터를 한정했다. 어떤 구속력이 있니? 설명해 주실 수 있습니까? – Surjeet

답변

1

당신이 UI의 동일한 부분을 반복해야 할 때마다, 당신은 단지 넣을 수 있습니다 : 여기

내 코드의 XAML 코드 해당 부분 (UI 요소) int o a UserControl ... 바로 그게 그들이 원하는 것입니다. UI 컨트롤을 XAML에 추가하면 DependencyProperty을 추가하여 UserControl 외부의 Bind 데이터를 컨트롤 내부에 표시 및/또는 편집 할 수 있습니다. 다음은 간단한 예제이다

에서 UserControl 코드 숨김

public static DependencyProperty YourCollectionProperty = DependencyProperty.Register(
    "YourCollection", typeof(ObservableCollection<string>), typeof(YourUserControl)); 

public ObservableCollection<string> YourCollection 
{ 
    get { return (ObservableCollection<string>)GetValue(YourCollectionProperty); } 
    set { SetValue(YourCollectionProperty, value); } 
} 

UserControl XAML에서 :

<YourXamlNamespacePrefix:YourUserControl YourCollection="{Binding SomeCollection}" /> 

그리고 다른 곳에서

:

<ListBox ItemsSource="{Binding YourCollection, RelativeSource={RelativeSource 
    AncestorType={x:Type YourUserControl}}}" /> 

는 그런 다음 UserControl를 사용하여
<YourXamlNamespacePrefix:YourUserControl YourCollection="{Binding OtherCollection}" /> 
+0

그리드가있는 User 컨트롤을 만들었습니다. 이제 버튼을 클릭 할 때마다 해당 사용자 정의 컨트롤을 tabitem으로 사용하려고합니다. 어떻게 할 수 있습니까? – Surjeet

+0

필자의 예제에서'UserControl'을 사용하는 방법을 보여주었습니다 ... 그 줄을'TabItem.Content' 섹션에 추가하기 만하면됩니다. – Sheridan

+0

고마워요. 귀하의 제안이 도움이되었습니다. – Surjeet