Как получить доступ к элементу управления внутри шаблона данных списка? - PullRequest
4 голосов
/ 09 апреля 2010

Привет, у меня есть следующий код:

<ListBox x:Name="foldersListBox" Grid.Column="0" MouseLeftButtonUp="foldersListBox_MouseLeftButtonUp" 


                             BorderThickness="0"  Height="AUTO" 
                             ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                             ScrollViewer.VerticalScrollBarVisibility="Disabled">
                        <DataTemplate>
                            <Border BorderBrush="LightGray"
                            BorderThickness="2"
                            CornerRadius="4">
                                <Image x:Name="folderImage" Width="70" Height="70" Margin="3" />
                            </Border>
                        </DataTemplate>
</ListBox>

Теперь, когда я пытаюсь получить доступ к folderImage из кода позади. Я могу использовать загруженное событие и типизировать отправителя как тип изображения, но я не хочу этого, потому что я хочу связать источник изображения во время связывания во время выполнения. Так что, даже если мы попробуем загрузить событие, это не поможет, так как элемент управления не будет загружен.

Помогите плз.

Спасибо, Subhen

1 Ответ

1 голос
/ 09 апреля 2010

В вашем вопросе не хватает деталей, но я все равно собираюсь ответить. Это очень непохоже на ответ на ваш вопрос, но может помочь вам понять, какие детали вам нужно добавить, чтобы направлять ответы. В свою очередь этот ответ может быть уточнен. Через несколько итераций вы можете получить ответ.

Я предполагаю, что вы привязываетесь к набору объектов, которые представляют «Папки», но вы хотите программно изменить представляемое изображение в зависимости от состояния каждого объекта, например, от некоторого свойства FolderType.

Решением этой проблемы является использование преобразователя значений, если ваши изображения из конечного набора.

public class FolderToImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Folder folder = value as Folder;
        ImageSource result;
        // Logic to determine which ImageSource to use for a folder.
        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Теперь взгляните на этот XAML: -

<Grid x:Name="LayoutRoot">
    <Grid.Resources>
       <local:FolderToImageConverter x:Key="ImageConverter" />
    </Grid.Resources>
    <ListBox x:Name="foldersListBox">
        <ListBox.ItemTemplate>
             <DataTemplate> 
                <Border BorderBrush="LightGray" BorderThickness="2" CornerRadius="4"> 
                  <Image Source="{Binding Converter={StaticResource ImageConverter}}" Width="70" Height="70" Margin="3" /> 
                </Border> 
             </DataTemplate> 
        </ListBox.ItemTemplate>
    </ListBox> 
</Grid>

После того, как вы связали свою коллекцию объектов Папки с ListBox ItemsSource, она отобразит набор изображений, используя конвертер для преобразования объекта Folder в правильный экземпляр ImageSource.

...