Привязка элементов управления изображением к наблюдаемой коллекции - PullRequest
1 голос
/ 19 января 2012

Я пытаюсь заставить ObservableCollection объектов BitmapSource связываться с кучей изображений в моей форме WPF, и изображение никогда не отображается ... Я проверил, что изображение загружается в свойство, но моя привязка должна быть неправильной. .... как должен быть закодирован путь привязки? Раньше я связывал каждое изображение с кучей разных объектов, но список гораздо удобнее использовать, поэтому я хочу связать их таким образом ......

В текстовых полях правильно отображается свойство ProgramPath, я просто не могу связать источники изображений

XAML - Внутри сетки у меня есть несколько текстовых полей и изображений рядом друг с другом

<TextBox HorizontalAlignment="Stretch" Margin="24,2,2,2" Name="TextBoxA" VerticalAlignment="Stretch" 
                          Width="664" >
                    <Binding Path=".[0].ProgramPath" UpdateSourceTrigger="PropertyChanged">
                        <Binding.ValidationRules>
                            <local:ExternalProgramValidator/>
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox>
                <TextBox Grid.Row="1" HorizontalAlignment="Stretch" Margin="24,2,2,2" Name="TextBoxB" VerticalAlignment="Stretch" Width="664" >
                    <Binding Path=".[1].ProgramPath" UpdateSourceTrigger="PropertyChanged">
                        <Binding.ValidationRules>
                            <local:ExternalProgramValidator/>
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox>

<Image Height="16   " HorizontalAlignment="Left" 
                       Margin="4" Name="ImageA" Stretch="Fill" VerticalAlignment="Center" Width="16"                           
                       Source="{Binding Path=.[0].ProgramImage, UpdateSourceTrigger=PropertyChanged}">
                </Image>
                <Image Grid.Row="1" Height="16   " HorizontalAlignment="Left" 
                       Margin="4" Name="ImageB" Stretch="Fill" VerticalAlignment="Center" Width="16"
                       Source="{Binding Path=.[0].ProgramImage, UpdateSourceTrigger=PropertyChanged}"/>

Тогда у меня есть такой публичный класс

public class ExternalProgramsWindowData : INotifyPropertyChanged
{
    private BitmapSource _ExtractPathImage(string fullPath)
    {
        BitmapSource returnedImage = null;

        string pathForImage = string.Empty;
        string[] s = fullPath.Split(new string[] { ".exe" }, StringSplitOptions.None);

        if (s[0] != null)
        {
            pathForImage = s[0] + ".exe";
        }

        if (!string.IsNullOrWhiteSpace(pathForImage))
        {
            System.Drawing.Icon icon = IconExtractor.GetIcon(pathForImage, true);

            returnedImage = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(
                icon.Handle,
               System.Windows.Int32Rect.Empty,
                System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
        }

        return returnedImage;

    }

    /// <summary>
    /// A
    /// </summary>
    private string _programPath;
    public string ProgramPath
    {
        get { return _programPath; }
        set
        {
            _programPath = value;
            Notify("ProgramPath");
            ProgramImage = _ExtractPathImage(_programPath);
        }
    }

    private BitmapSource _programImage;
    public BitmapSource ProgramImage
    {
        get { return _programImage; }
        set
        {
            _programImage = value;
            Notify("ProgramImage");
        }
    }


    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    protected void Notify(string propName)
    {
        if (this.PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
    }

    #endregion
}

В классе главного окна я связываю сетку с коллекцией объектов этого класса

/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class ExternalProgramsWindow : Window
{


    public ObservableCollection<ExternalProgramsWindowData> WindowDataList { get; set; }


WindowDataList = new ObservableCollection<ExternalProgramsWindowData>();

        ExternalPrograms_ExternalProgramsGrid.DataContext = WindowDataList;

Затем я загружаю коллекцию, и свойство ProgramPath устанавливается, и оно запускает настройку ProgramImage (который устанавливается на изображение правильно, но окно не отображает изображение)

foreach (ExternalProgram program in externalProgramList)
        {
            ExternalProgramsWindowData oExternalProgramsWindowData = new ExternalProgramsWindowData();
            oExternalProgramsWindowData.ProgramPath = program.Path + " " + program.Arguments;


            WindowDataList.Add(oExternalProgramsWindowData);

1 Ответ

0 голосов
/ 19 января 2012

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

// assuming ExternalProgramsWindowData are your bitmap objects
public class SourceList : ObservableCollection<ExternalProgramsWindowData> {

}

public class ViewModel : INotifyPropertyChanged {

    private SourceList mySourceList;

    public SourceList MySourceList {
         get { return mySourceList; }
         set {
             mySourceList = value;
             FirePropertyChanged("MySourceList");
             }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void FirePropertyChanged (string propertyName) {

        if (PropertyChanged != null) {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

}

Тогда в фактическом Связывании возникает следующая ситуация:

Источник привязки: объект ViewModel. Путь привязки: «MySourceList».

Я не знаком с данными ExternalProgramsWindowData, но, возможно, вам придется использовать ValueConverter для того, чтобы привязка работала.

Итак, обратите внимание, что когда ваши данные Viewmodels не совместимы с вашими данными Views, привязка не будет работать, хотя пути привязки установлены правильно.

Надеюсь, это поможет:)

...