Моя программа принимает имена входных файлов либо как параметры командной строки, либо в операции перетаскивания, либо в проводнике, щелкая имена файлов с расширением, связанным с моей программой.
Командная строка и перетаскивание работают нормально, но щелчок по именам файлов в проводнике вызывает проблемы, когда в путях к файлам, по которым щелкнули, есть пробелы, например:
c:\temp\file one.txt
c:\my directory\filetwo.txt
c:\my directory\file three.txt
тогда функция ParamStr дает мне назад: } urlpatterns = patterns ('', (r '^ ...
Я использую общие представления django, как мне получить доступ к запросу в моем шаблоне.
URL-адреса:
file_objects = {
'queryset' : File.objects.filter(is_good=True),
}
urlpatterns = patterns('',
(r'^files/', 'django.views.generic.list_detail.object_list', dict(file_objects, template_name='files.html')),
)
-121 --- 1431067) - Учитывая следующий код XAML с поведением, подобным ListControl:
<StackPanel>
<ItemsControl Name="_listbox" ItemsSource="{Binding ElementName=_userControl, Path=DataContext}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<DockPanel>
...
</DockPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
Поскольку список может быть длинным (100-200 элементов), а элементы выглядят аналогично, я думаю, что было бы полезно для пользователя во время прокрутки, если бы каждый элемент отображал свою позицию в списке. Как элемент в шаблоне может знать свою позицию в списке?
Вот решение для взлома. Мы можем использовать преобразование значений с DataBinding. Итак, первый шаг — объявить наш ValueConvertor:
public class ListItemToPositionConverter : IValueConverter
{
#region Implementation of IValueConverter
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var item = value as ListBoxItem;
if (item != null)
{
var lb = FindAncestor<ListBox>(item);
if (lb != null)
{
var index = lb.Items.IndexOf(item.Content);
return index;
}
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
Объявите где угодно этот статический метод, чтобы получить родителя ListBox:
public static T FindAncestor<T>(DependencyObject from) where T : class
{
if (from == null)
return null;
var candidate = from as T;
return candidate ?? FindAncestor<T>(VisualTreeHelper.GetParent(from));
}
Затем в ListBox.Resources объявите наш конвертер следующим образом:
<ListBox.Resources>
<YourNamespace:ListItemToPositionConverter x:Key="listItemToPositionConverter"/>
</ListBox.Resources>
И, наконец, DataTemplate:
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Converter={StaticResource listItemToPositionConverter}}"/>
<Label Content="{Binding Path=DisplayName}"></Label>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
Примечание: в этом примере элементы будут нумероваться, начиная с 0 (ноль), вы можете изменить это в методе Convert, добавив 1 к результату.
Надеюсь, это поможет...
Согласно статье MSDN Magazine "Диаграммы с шаблонами данных":
[...]DataTemplate потребуется доступ к индексу определенного элемента данных в коллекции. Но достаточно просто включить эту информацию в бизнес-объект[...]
Таким образом, если не было изменений в .NET 4, свойство «индекс этого элемента» отсутствует, если только оно явно не включено в модель. .