Передать параметры в привязку изображения - PullRequest
1 голос
/ 09 февраля 2010

У меня есть несколько пунктов меню, таких как:

<navigation:RadMenuItem Header="New Assignment">
    <navigation:RadMenuItem.Icon>
        <Image Source="/Images/New_Assignment.jpeg" Width="20" Height="20" />
    </navigation:RadMenuItem.Icon>
</navigation:RadMenuItem>
<navigation:RadMenuItem Header="New Course">
    <navigation:RadMenuItem.Icon>
        <Image Source="/Images/New_Course.jpeg" Width="20" Height="20" />
    </navigation:RadMenuItem.Icon>
</navigation:RadMenuItem>
<navigation:RadMenuItem Header="New Folder">
    <navigation:RadMenuItem.Icon>
        <Image Source="/Images/New_Folder.jpeg" Width="20" Height="20" />
    </navigation:RadMenuItem.Icon>
</navigation:RadMenuItem>

Обратите внимание, что я должен установить значок для каждого элемента. (Все значки находятся в папке / Images /). Как я могу передать параметр, чтобы я мог сказать:

<navigation:RadMenuItem Header="New Assignment" Icon="{Binding ImageCollection, param1=New_Assignment.jpeg}" />

Где ImageCollection - это коллекция изображений в папке / Images /.

Ответы [ 2 ]

2 голосов
/ 09 февраля 2010

Есть решение вашей проблемы.

В качестве переменной ImageCollection вы используете словарь типа , например:

public Dictionary< string, ImageSource> ImageCollection{ get; set; }

Теперь, чтобы создать свою коллекцию, вы должны указать правильный ImageSource с допустимым URI.

Вы начинаете с вашего базового адреса, в вашем случае "/ Images", чтобы вы могли изменить свой базовый адрес в одной точке вашего кода вместо того, чтобы искать все вхождения адреса изображения ... просто для удобства.

const readonly string BASE_ADDR = "/Images";

Теперь вы можете начать строить свою коллекцию изображений следующим образом:

ImageCollection = new Dictionary< string, ImageSource>
{
    { "New_Assignment", new BitmapImage(BASE_ADDR + "/New_Assignment.jpeg") }
    ...
    ...
}

Теперь в вашем XAML вы можете связать так:

<navigation:RadMenuItem
  Header="New Assignment"
  Icon="{Binding ImageCollection[New_Assignment]}" />

Это должно хорошо работать. Удачного кодирования.

0 голосов
/ 09 февраля 2010

Я думаю, что идеальным способом было бы использовать ListBox с привязкой к данным, привязанный к коллекции элементов навигационного меню:

<ListBox DataContext="{Binding MyCollectionOfNavigationItems}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <navigation:RadMenuItem Header="{Binding Header}" Icon="{Binding ImagePath, Converter={StaticResource PathToImageConverter}}"
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

и привязка его к коллекции элементов, которые могут быть структурированы примерно так:

public class NavigationItem {
    public string Header { get; set; }
    public string ImagePath { get; set; }
}

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

Если это не вариант, вы, вероятно, можете сделать это, используя MultiBinding и присоединенное свойство, но если вы все еще пишете синтаксис MultiBinding для каждого элемента, это будет еще более многословно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...