0

我正在使用 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 是相同的,所以任何进一步的添加都不会导致任何问题?或者有没有更好的方法来处理这个问题,因为绑定方法工作得很好。

干杯

4

2 回答 2

3

这需要一个 ViewModel

这种类型的问题,绑定在简单的情况下工作得很好,但随着您添加场景而开始下降,这是一个很好的指标,表明是时候使用Model - View - ViewModel了。

粗略地说,这个想法是你有一个视图(你的 XAML)和一个模型(你的数据,在这种情况下是一组文件)。但不是直接将视图绑定到数据,而是添加一个称为 ViewModel 的中间类。您的 View 绑定到 ViewModel 并且您的 ViewModel 从 Model 加载自身。这为您提供了在加载要绑定的数据时做更多简单事情的空间。

这是什么意思?它看起来像:

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 中,您将 datacontext 设置为新的 MainViewModel。您可以在代码后面或使用 StaticResource 来执行此操作,如果您使用 StaticResource,则需要一个不带参数的 ctor,因此您必须以其他方式设置初始目录。然后你的绑定看起来像:

<Image Source={Binding Images} />

好好看看 MV-VM 模式。您会发现它使此类数据绑定问题变得更容易,并且还具有许多其他好处,例如更少的事件处理程序(因此更少的引用泄漏)、更好的可测试性、更容易使用 Blend 以及更容易添加新类型的 UI 技术。

于 2010-10-21T14:57:11.513 回答
0

我也是 Surface 开发的新手,无论如何我所拥有的是删除数据绑定并通过 for 循环手动添加图像。

于 2010-10-21T14:52:46.173 回答