2014-12-06 4 views
-1

Попытка понять это лучше.Как связать свойство ItemsControl с зависимым свойством usercontrol?

У меня есть ItemsControl определено в моей MainView что-то как этот

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

</ItemsControl> 

, в котором я хотел бы использовать DataTemplate:

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

InkRichTextView вид со свойством зависимостей , RichText, используемый для передачи абзаца из примечаний ObservableCollection (InkRichViewModel) в mainview для пользовательского элемента управления. То есть, это работает правильно для одного параграфа:

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

, где примечание определено как абзац в MainView.

Проблема заключается в том, как написать DataTemplate и ItemsControl таким образом, что ItemsControl может передать каждый абзац из наблюдаемого коллекционирования в свойство зависимостей RichText в InkRichTextView?

Спасибо за любые рекомендации. (я надеюсь, что это понятно!)

+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

Основываясь на том, что вы описали, это, кажется, что каждый пункт в вашем ItemsControl абзац, сам объект, который вы хотите назначить InkRichTextView.RichText собственности. Это верно?

Если это так, имейте в виду, что в шаблоне элемента контекст данных является самим элементом коллекции - таким образом, путь, который вы ищете, не относится к свойству контекста данных, а к самому контексту данных ,

Это делается с точки (.) пути:

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

Вышеуказанное полезно, но теперь я получаю 10 пустых абзацев. Насколько я могу судить, RichText не инициализируется. ??? –

+0

@AlanWayne: Есть ли какие-либо ошибки привязки, отображаемые вашей IDE? –

+0

Да. как видно в окне «Вывод», значение, созданное BindingExpression, недействительно для целевого свойства; Значение = 'Nova5.UI.ViewModels.Ink.InkRichViewModel' BindingExpression: Path =; DataItem = 'InkRichViewModel' (HashCode = 16892667); целевой элемент - «InkRichTextView» (Name = ''); target свойство «RichText» (тип «Абзац») –

0

Я отправляю это как ответ, хотя кредит принадлежит O.R.Mapper и Murven за то, что указал мне в правильном направлении. Мой пост - помочь кому-то еще просто изучить это.

В очень простых терминах ItemControl выполняет циклическое действие над коллекцией в своем ItemsSource. В моем случае ItemsSource представляет собой набор типов InkRichViewModel. (Отсюда вопрос от Мервена). В своем циклическом действии ItemSource будет создавать объекты из InkRichViewModel. (Таким образом, у моего usercontrol теперь есть отдельный datacontext!). Каждый из этих объектов будет использовать ItemTemplate для отображения.Таким образом, чтобы упростить вещи, я переехал DataTemplate из UserControl ресурсов в рамках самой ItemControl как:

<ItemsControl Grid.Column="0" Grid.Row="2" 
        ItemsSource="{Binding Notes}" 
        > 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <v:InkRichTextView RichText="{Binding Note}" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

Теперь, когда каждый из моих UserControls имеет свой собственный DataContext быть назначен на ItemsControl, окно Output (VS2010) в настоящее время показывает ошибки привязки. Исправление этих ошибок приводит к рабочему решению.

Надеюсь, что это поможет другим новичкам, таким как я. Всем спасибо.

(по электронной почте Ой! Просто увидел ответ от Murven, но я оставлю это, если это поможет кому-то понять.)