2011-10-29 2 views
1

Я использую xml как источник моего приложения через привязку. в xml есть список папок и путь для образца изображения для каждой папки. Список папок привязан к списку, а другой экран привязан к выбранному элементу списка, который является элементом списка xml (тип XmlNode). Я добавил оперативность для добавления и удаления элементов с помощью XmlDocument, который был скопирован из xml XmlProvider и сохранил его в исходном файле.Конвертер привязки изображения Imagebrush image

Проблема начинается, когда исходный список пуст, либо на время загрузки приложения, либо после удаления всех элементов. в этот момент все привязанные значения дисплея равны нулю. Я решил все привязки с свойством TargetNullValue привязки, за исключением свойства image image_source изображения canvas, которое ничего не показывает.

Я попытался использовать конвертер, но когда я его отладил, я увидел что-то странное. если в списке были элементы, конвертер вернул то, что нужно, и изображение было отображено, но если список пуст, конвертер вернул то, что ему нужно, и изображение не было показано! PLZ помогите мне.

Код:

XML:

<Folders> 
    <Folder Id="1"> 
     <Path>folder3\1</Path> 
     <SampleImage>C:\images\2011-09-22\site3\1\6.jpg</SampleImage> 
    </Folder> 
    </Folders> 

XAML:

<Canvas.Background> 
     <ImageBrush x:Name="SampleImage" Stretch="Uniform" > 
     <ImageBrush.ImageSource> 
      <MultiBinding Converter="{StaticResource ImageConverter}" Mode="OneWay"> 
      <Binding XPath="./SampleImage" /> 
      <Binding Source="C:\images\SampleImages\no_image.jpg"/> 
      </MultiBinding> 
     </ImageBrush.ImageSource> 
     </ImageBrush> 
    </Canvas.Background> 

C#:

public class ImageConverter : IMultiValueConverter 
{ 
    public object Convert(object[] value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     ImageSourceConverter imageConverter = new ImageSourceConverter(); 
     bool bool1=value[0].Equals(DependencyProperty.UnsetValue); 
     if (value[0] != null &&!bool1) //if the source isn't null 
     { 
      //this works fine 
      return imageConverter.ConvertFromString(value[0].ToString()); 
     } 
     //here the converter returns the right object but the alternate image isn't shown and the background left blank 
     return imageConverter.ConvertFromString(value[1].ToString()); 

     //here too the converter returns the right object but the alternate image isn't shown and the background left blank 
     //return imageConverter.ConvertFromString(@"C:\images\SampleImages\no_image.jpg"); 

    } 


    public object[] ConvertBack(object value, Type[] targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 

} 
+0

Это, вероятно, слишком очевидно, но * C: \ images \ SampleImages \ no_image.jpg * на самом деле это правильно? И это не просто пустой образ? –

+0

Изображение есть. если я поместил этот путь в образ Образца в XML, изображение будет показано как должно. – Seffix

ответ

0

Вы вызываете метод на одном из значений перед тем, проверив его за ноль:

bool bool1=value[0].Equals(DependencyProperty.UnsetValue); 
if (value[0] != null &&!bool1) 

Это всего лишь один из возможных источников ошибок. Конечно, пути к файлам должны быть правильными, как уже указывал Кент Боогаарт. Далее: «это не работает» is не полезно, если вы хотите, чтобы хорошие ответы предоставили как можно больше информации. то, что именно произошло &, что вы ожидали и как эти ожидания не были выполнены.


Преобразователь может быть сжат до следующего по пути:

string path = (value[0] is string && value[0] != null) ? 
    (string)value[0] : (string)value[1]; 
return new ImageSourceConverter().ConvertFromString(path); 

Вполне возможно, до сих пор не идеально, но менее хаотичным.


Edit: Как код работает для меня, я подозреваю, что раскладка виноват, если нет никаких элементов элемент управления, возможно, не занимают места больше, следовательно, делает изображение невидимым.

+0

Во-первых, я добавил к этому комментарии комментарии. Во-вторых, я попробовал сжатый код, но он имеет тот же результат. – Seffix

+0

Пробовали ли вы использовать другой файл изображения или применить конвертер на другом элементе управления? Этот код работает для меня, если первое bindng не позволяет ему правильно использовать альтернативное изображение. –

+0

Также см. Редактирование в нижней части моего ответа. –

Смежные вопросы