ItemControl неправильно связывает объекты - PullRequest
0 голосов
/ 09 марта 2012

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

<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>

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

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

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

открытый класс SalesOptionButton {приватная строка _name;private Option _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 для элемента управления Option:

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

Для каждой опции, которая находится в источнике данных, создается кнопка.На этих кнопках должно отображаться название опции, и при нажатии кнопки отправлять сообщение в основное приложение, которое будет обрабатывать этот щелчок (установить выбранную опцию).

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

Ответы [ 2 ]

0 голосов
/ 09 марта 2012

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

У этого элемента управления есть источник элемента, который представляет собой список объектов 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}"/>
0 голосов
/ 09 марта 2012

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

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

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