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