2009-03-02 6 views
3

관찰 가능한 컬렉션에 바인딩 된 tabControl이 있습니다. headerTemplate에서 문자열 속성에 바인딩하고 싶습니다. contentTemplate에서 사용자 정의 컨트롤을 배치했습니다.tabControl의 여러 userControl 인스턴스

<Grid> 
    <Grid.Resources>    
     <DataTemplate x:Key="contentTemplate"> 
       <local:UserControl1 /> 
     </DataTemplate> 

     <DataTemplate x:Key="itemTemplate"> 
       <Label Content="{Binding Path=Name}" /> 
     </DataTemplate> 
    </Grid.Resources> 

    <TabControl IsSynchronizedWithCurrentItem="True" 
       ItemsSource="{Binding Path=Pages}" 
       ItemTemplate="{StaticResource itemTemplate}" 
       ContentTemplate="{StaticResource contentTemplate}"/> 

</Grid> 

그리고 뒤에 해당 코드 :

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     this.DataContext = new MainWindowViewModel(); 
    }   
} 

public class MainWindowViewModel 
{ 
    public ObservableCollection<PageViewModel> Pages { get; set; } 

    public MainWindowViewModel() 
    { 
     this.Pages = new ObservableCollection<PageViewModel>(); 
     this.Pages.Add(new PageViewModel("first")); 
     this.Pages.Add(new PageViewModel("second")); 
    } 
} 

public class PageViewModel 
{ 
    public string Name { get; set; } 

    public PageViewModel(string name) 
    { 
     this.Name = name; 
    } 
} 

그래서 (A ControlTemplate이뿐만 아니라 ItemTemplate을 지정하는 데)이 시나리오에서 문제가 여기에

는하여 MainWindow.xaml에 대한 코드입니다 그 경우에만 하나의 인스턴스를 사용자 정의 컨트롤로 가져옵니다. 여기서 바인딩되는 각 항목에 대한 인스턴스를 갖고 싶습니다.

+0

_ "각 항목에 대한 인스턴스를 갖고 싶습니다."- 여기에 필요를 명확히하십시오. _Why_ 구체적으로 각 항목에 대해 하나의 새 인스턴스를 만드시겠습니까? 구체적으로 말하자면, 문제를 확실하게 재현 할 수있는 좋은 [mcve]를 제공하고, 코드가 무엇을하는지, 어떻게 그것이 원하는 것과 다른지를 정확하게 설명하십시오. _ (늦은 시간에 chiming에 대한 사과 ... 나는이 질문을 건너 뛰었을 뿐이었다. (http://stackoverflow.com/q/33125188); 다른 하나, 그래서 나는 명확히 해달라고 요청했다.) _. –

답변

1

설정해보십시오

X :

false로 설정

가 리소스에 대한 요청을 위해 새 인스턴스를 만들 것 같은 윈도우 프리젠 테이션 파운데이션 (WPF) 리소스 검색 동작을 수정 공유 = "거짓" 모든 요청에 ​​대해 동일한 인스턴스를 공유하지 않고 각 요청을 처리합니다.

+0

아쉽게도 작동하지 않습니다. 나는 그것을 contentTemplate에 설정하려고했지만 행운이 없다. (별도의 resourceDictionary에 정의 된 경우조차도). 그리고 난 심지어 그것을 userControl에 설정할 수 없습니다 ... – Jowen

+0

이 기사를 읽기 조쉬 스미스 (http://joshsmithonwpf.wordpress.com/2009/01/27/my-mvvm-article-in-msdn- 잡지 /)이 기사에서는 그는 tabcontrol에서 여러보기 (usercontrols)를 호스팅 ... – rudigrobler

+0

또한이 문서 (http://www.dev102.com/2009/03/02/tidy-up-your-xaml- and-code-behind-use-usercontrols-inside-templates /) 오늘 아침에 발견했습니다. – rudigrobler

1

이 시도 :

<TabControl IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Pages}"> 
    <TabControl.Resources> 
     <DataTemplate x:Key="contentTemplate" x:Shared="False"> 
      <local:UserControl1/> 
     </DataTemplate> 
     <Style TargetType="{x:Type TabItem}"> 
      <Setter Property="Header" Value="{Binding Name}"/> 
      <Setter Property="ContentTemplate" Value="{StaticResource contentTemplate}"/> 
     </Style> 
    </TabControl.Resources> 
</TabControl> 
+0

나를. 감사 – zleao

-1

당신은 당신의 PageViewModel 클래스의 Equals() 메소드를 오버라이드 (override) 할 필요가있다.

public override bool Equals(object obj) 
{ 
    if (!(obj is PageViewModel)) return false; 

    return (obj as PageViewModel).Name == this.Name; 
} 

이와 비슷한 기능이 작동합니다.

이제 이름 값과 동일한 속성을 찾습니다. 그렇지 않은 경우 고유 한 ID 속성을 추가 할 수도 있습니다.