WPF ScatterView привязка к нескольким источникам - PullRequest
0 голосов
/ 21 октября 2010

Я использую ScatterView и в настоящее время привязываю к папке, чтобы при запуске моего приложения отображались некоторые образцы изображений, это прекрасно работает.

<s:ScatterView x:Name="MainScatterView">
        <s:ScatterView.ItemTemplate>
            <DataTemplate>
                <Image Source="{Binding}"/>
            </DataTemplate>
        </s:ScatterView.ItemTemplate>
    </s:ScatterView>

Затем я устанавливаю привязку, используя

 scatter.ItemsSource =
                System.IO.Directory.GetFiles(imagesPath, "*.jpg");

Это прекрасно работает, но затем, когда я пытаюсь добавить дополнительные изображения:

Image img = new Image();
        img.Source =
            new BitmapImage(new Uri("\\Resources\\Koala.jpg", UriKind.Relative));
        scatter.Items.Add(img);

, я получаю исключение InvalidOperationException:Операция недопустима, когда используется ItemSource.

Каков наилучший способ справиться с этим.Удалить привязку и добавить изображения вручную при запуске?Я предполагаю, что так как ItemSource - то же самое, любые дальнейшие добавления не вызовут никаких проблем?Или есть лучший способ справиться с этим, поскольку метод привязки работает очень хорошо.

cheers

Ответы [ 2 ]

3 голосов
/ 21 октября 2010

Это требует ViewModel

Этот тип проблемы, привязка хорошо работает для простого случая, но начинает падать, когда вы добавляете сценарии, является отличным показателем того, что пора использовать Модель - Вид - ViewModel .

Грубо говоря, идея в том, что у вас есть View (ваш XAML) и Model (ваши данные, в данном случае набор файлов). Но вместо прямой привязки View к данным вы добавляете промежуточный класс, называемый ViewModel. Ваш View привязывается к ViewModel, а ViewModel загружает себя из Модели. Это дает вам пространство для маневра, чтобы делать больше, чем простые вещи при загрузке данных для привязки.

Что это значит здесь? Это будет выглядеть так:

public class MainViewModel
{
    // ObservableCollection adds databinding goodness so when you add a new file,
    // the UI automatically refreshes
    public ObservableCollection<string> Images { get; private set; }

    public MainViewModel(string path)
    {
        Images = new ObservableCollection<string>();
        Images.AddRange(Directory.GetFiles(path, "*.jpg"));
    }

    public void AddImage(string path)
    {
        Images.Add(path);
    }
}

и теперь в вашем xaml вы устанавливаете свой текстовой текст данных на новый MainViewModel. Вы можете сделать это в коде или с помощью StaticResource, если вы используете StaticResource, вам нужен ctor, который не принимает параметров, поэтому вам придется установить свой начальный каталог другим способом. Ваша привязка выглядит так:

<Image Source={Binding Images} />

Внимательно посмотрите на схему M-V-VM. Вы обнаружите, что это облегчает проблемы с привязкой данных, подобные этой, а также имеет множество других преимуществ, таких как меньшее количество обработчиков событий (меньшее количество утечек ссылок), лучшую тестируемость, упрощение работы с Blend и упрощение добавления новых типов технологий пользовательского интерфейса.

0 голосов
/ 21 октября 2010

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

...