2012-03-08 2 views
0

У меня есть страница XAML, содержащий ItemControl тег (приложение использует структуру MVVM света):ItemControl не связывающие объекты правильно

<ItemsControl MinWidth="100" MinHeight="25" ItemsSource="{Binding Path=Options}" HorizontalAlignment="Left" d:LayoutOverrides="Height" Margin="10,0"> 
    <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel Orientation="Horizontal" /> 
      </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

Этот элемент управления имеет источник элементов, который является списком Опционные объекты. Шаблон данных для этого элемента управления элементом выглядит следующим образом:

<DataTemplate DataType="{x:Type Sales:Option}"> 
    <local:SalesOptionButton d:LayoutOverrides="Width, Height" DataContext="{Binding}"/> 
</DataTemplate> 

У меня есть модель представления, связанная с контролем SalesOptionButton, который выглядит следующим образом:

общественного класс SalesOptionButton { частной строка _name; частный вариант _Option;

public ICommand SelectedOptionButtonCommand { get; set; } 

    public string Name 
    { 
     get { return _name; } 
     set { SetStructPropertyValue(ref _name, value); } 
    } 

    public Option Option 
    { 
     get { return _scriptOption; } 
     set { SetPropertyValue(ref _scriptOption, value); } 
    } 

    public SalesScriptOptionButton(ScriptOption option) 
    { 
     Option = option; 
     Name = option.OptionText; 
    } 

    protected override void RegisterForMessages() 
    { 
     SelectedOptionButtonCommand = new RelayCommand(OptionButtonSelected); 
    } 

    private void OptionButtonSelected() 
    { 
     MessengerService.Send(ScriptOptionSelectedMessage.Create(ScriptOption)); 
    } 

    protected override void SetDesignTimeInfo(){} 
} 

Вот XAML для контроля Опция:

<UserControl [INCLUDES]> 
    <Button Height="25" Padding="1" MinWidth="100" Content="{Binding Name}" Command="{Binding SelectedOptionButtonCommand}"/> 
</UserControl> 

Что это делает, для каждого варианта, который находится в источнике данных, кнопка создается. Эти кнопки должны отображать имя параметра и, когда нажимается кнопка, отправить сообщение в основное приложение, которое будет обрабатывать этот клик (установить выбранный вариант).

Проблема, которую я вижу, заключается в том, что кнопки создаются, но ничто другое не связано (на кнопке не отображается имя опции, и кнопка не работает). Может ли кто-нибудь дать мне представление о том, почему это не работает, как я думаю, что это должно быть?

+0

, где вы определяете: '' –

ответ

0

Вы не устанавливаете шаблон данных в качестве свойства элемента управления элементами.

<ItemsControl ItemTemplate={StaticResource OptionTemplate} .../> 

<DataTemplate x:Key="OptionTemplate" DataType="{x:Type Sales:Option}"> 
    <local:SalesOptionButton d:LayoutOverrides="Width, Height" DataContext="{Binding}"/> 
</DataTemplate> 
+0

На самом деле вы не должны Не нужно. Они указали тип, и ItemControl должен забрать его без необходимости явно указывать шаблон. –

+0

Это не работает. Я получаю следующее исключение: Не удается найти ресурс с именем «OptionTemplate». Имена ресурсов чувствительны к регистру. –

+0

Возможно, вы правы, но я считаю, что безопаснее быть явным.Я хотел бы увидеть определение свойства * Options *. – Phil

0

Трудно расшифровать сообщение, когда бит и фрагменты кода отсутствуют. Вы говорите:

Этот элемент управления имеет источник предметов, который представляет собой список объектов Option. Шаблон данных для этого элемента управления элемента выглядит следующим образом:

<DataTemplate DataType="{x:Type Sales:Option}"> 
    <local:SalesOptionButton d:LayoutOverrides="Width, Height" DataContext="{Binding}"/> 
</DataTemplate> 

Вы не показали нам свой Option класс - только ваш SalesOptionButton класс. Предположительно, ваш тип Option имеет некоторое свойство, которое дает соответствующий пример SalesOptionButton? Если это так, то ваш шаблон данных здесь не так:

<local:SalesOptionButton d:LayoutOverrides="Width, Height" DataContext="{Binding}"/> 

Вы установки DataContext в SalesOptionButton к экземпляру Option, а не к экземпляру SalesOptionButton. Я предполагаю, что (и я должен), что вы хотите что-то вроде этого:

<local:SalesOptionButton d:LayoutOverrides="Width, Height" DataContext="{Binding SalesOptionButton}"/> 
Смежные вопросы