2014-12-06 7 views
-1

이 점을 더 잘 이해하려고합니다.ItemsControl을 usercontrol의 종속성 속성에 바인딩하는 방법은 무엇입니까?

내가 ItemsControl에 내 MAINVIEW에 정의 내가 DataTemplate을 사용하고자하는이

<ItemsControl Grid.Column="0" Grid.Row="2" 
        ItemsSource="{Binding Notes}" 
        ItemTemplate="{Binding Source={StaticResource MyParagraph}}" 
    > 

</ItemsControl> 

같은 뭔가 있습니다

<UserControl.Resources> 
    <DataTemplate x:Key="MyParagraph"> 
     <v:InkRichTextView 
      RichText="{Binding ?????? " 
    </DataTemplate> 
</UserControl.Resources> 

InkRichTextView은 종속성 속성과 도면이다 , RichText, mainview의 ObservableCollection (InkRichViewModel) Notes에서 사용자 정의 컨트롤로 단락을 전달하는 데 사용됩니다. 즉, 하나의 항목에 대해 올바르게 작동합니다.

<v:InkRichTextView RichText ="{Binding Path=Note}" Grid.Column="0" Grid.Row="0" /> 

여기서 Note는 MainView에서 단락으로 정의됩니다.

문제는 어떻게 DataTemplate과 ItemsControl을 작성하여 observablecollection의 각 단락을 InkRichTextView의 RichText 속성에 전달할 수 있는지입니다.

어떤 안내해 주셔서 감사합니다. (나는이 이해할 수있는 희망!) 당신이 설명하는 내용에 따라

+0

어떻게 InkRichViewModel는 선언? "메모"라는 속성이 있습니까? – Murven

+0

@Murven RichText는 사용자 정의 컨트롤 InkRichTextView의 종속성 속성입니다. 지금까지 종속성 속성을 잃지 않고 사용자 정의 컨트롤에 다른 DataContext를 사용할 수 없었습니다. 나는 확실히하고 싶다. (어쨌든이 작업이 가능할 것입니다.) –

+0

@Murven InkRichTextView의 코드 숨김에서 종속성 속성이 정의됩니다. –

답변

1

항목 제어 : 뒤에

<ItemsControl x:Name="NotesItemsControl" Grid.Column="2" HorizontalAlignment="Center"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <local:InkRichTextView RichText="{Binding Note}"/> 
       </Grid> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

코드 : 런타임시 어떻게 보이는지

class InkRichViewModel : System.ComponentModel.INotifyPropertyChanged 
    { 
     #region Note (INotifyPropertyChanged Property) 
     private string _note; 

     public string Note 
     { 
      get { return _note; } 
      set 
      { 
       if (_note != value) 
       { 
        _note = value; 
        RaisePropertyChanged("Note"); 
       } 
      } 
     } 
     #endregion 

     public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 
     private void RaisePropertyChanged(string p) 
     { 
      var propertyChanged = PropertyChanged; 
      if (propertyChanged != null) 
      { 
       propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(p)); 
      } 
     } 
    } 


    public MainWindow() 
    { 
     InitializeComponent(); 

     var item01 = new InkRichViewModel() { Note = "Note 01", }; 
     var item02 = new InkRichViewModel() { Note = "Note 02", }; 
     var item03 = new InkRichViewModel() { Note = "Note 03", }; 
     var item04 = new InkRichViewModel() { Note = "Note 04", }; 
     var item05 = new InkRichViewModel() { Note = "Note 05", }; 
     var itemList = new List<InkRichViewModel>() 
     { 
      item01, item02, item03, item04, item05, 
     }; 
     NotesItemsControl.ItemsSource = itemList; 

    } 

:

How it looks at runtime

찾고 계신가요?

+0

예! 이제 DataTemplate을 리소스로 이동하는 방법을 알아낼 수 있다면 모든 것이 완벽 할 것입니다. 고맙습니다. –

1

, 매우 당신이 InkRichTextView.RichText 속성에 할당 할 개체를, 당신의 ItemsControl의 각 항목은 단락 것 같다. 그 맞습니까?

그렇다면 항목 템플릿 내에서 데이터 컨텍스트가 컬렉션 항목 자체임을 유의하십시오. 따라서 찾고있는 경로는 데이터 컨텍스트의 속성이 아니라 데이터 컨텍스트 자체를 참조하십시오 . 점 (.) 경로로 이루어집니다

는 :

<v:InkRichTextView RichText="{Binding .}"/> 
+0

위의 내용이 유용하지만 지금은 10 개의 빈 단락이 표시됩니다. 내가 알 수있는 한, RichText는 초기화되지 않습니다. ??? –

+0

@AlanWayne : IDE에서 표시되는 바인딩 오류가 있습니까? –

+0

예. 출력 창에 표시된대로 BindingExpression에 의해 생성 된 값이 대상 속성에 유효하지 않습니다. Value = 'Nova5.UI.ViewModels.Ink.InkRichViewModel'BindingExpression : Path = .; DataItem = 'InkRichViewModel'(HashCode = 16892667); 대상 요소는 'InkRichTextView'(Name = ''); 대상 속성이 'RichText'(유형 '단락') –

0

저는 대답을 O.R.Mapper와 Murven에게 보내 주지만 올바른 방향으로 나를 가리키고 있습니다. 내 게시물은 이것을 배우는 다른 사람들을 돕는 것입니다.

간단히 말해서 ItemControl은 해당 ItemsSource의 컬렉션에 대해 반복 작업을 수행합니다. 필자의 경우 ItemsSource는 InkRichViewModel 형식의 컬렉션입니다. (따라서 Murven의 질문). 반복 작업에서 ItemsSource는 InkRichViewModel에서 개체를 만듭니다. (따라서, 내 usercontrol에는 이제 개별 datacontext가 있습니다!) 이러한 각 객체는 ItemTemplate을 사용하여 표시합니다.그래서 일을 단순화하기 위해, 나는에 UserControl을 자원에서 DataTemplate을 이동해 ItemControl 자체 내에서 같은 :

지금 내 된 UserControls 각각이 자신의 데이터 컨텍스트가 ItemsControl에, 출력 창 (VS2010)에 의해 할당되는 것을 이제
<ItemsControl Grid.Column="0" Grid.Row="2" 
        ItemsSource="{Binding Notes}" 
        > 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <v:InkRichTextView RichText="{Binding Note}" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

바인딩 오류를 보여줍니다. 이러한 오류를 수정하면 작동하는 솔루션이됩니다.

희망은 나 같은 다른 초보자를 도울 수 있기를 바랍니다. 모두에게 감사드립니다.

(어머! 그냥 Murven에서 답을 보았다하지만 이해하는 사람을 도움이된다면 나는이 떠날거야.)

관련 문제