WPF ScatterView绑定到多个源

时间:2010-10-21 14:36:02

标签: c# scatterview

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

欢呼声

2 个答案:

答案 0 :(得分:3)

这需要ViewModel

这种类型的问题,绑定在简单的情况下运行良好但在添加方案时开始下降,这是一个很好的指示,它是时候使用Model - View - ViewModel

粗略地说,这个想法是你有一个View(你的XAML)和一个Model(你的数据,在这种情况下是一组文件)。但是,不是直接将View绑定到Data,而是添加一个名为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} />

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

答案 1 :(得分:0)

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