在WPF中

时间:2018-04-09 04:48:27

标签: c# wpf mvvm

在WPF MVVM应用程序中,UserRetrols在远程桌面连接到pc后运行appplication时重新加载,之后我们遇到了一些问题。我读了这个link about WPF,但我无法解决这个问题。

有一个ItemsControl UserControl被添加到:

<ItemsControl ItemsSource="{Binding CamerasList}" x:Name="AllCamerasControl">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <local:SingleView />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

UserControl的构造函数如下:

public SingleCameraView()
{ 
    InitializeComponent();
    DataContext = new SingleViewModel();
}

有谁能告诉我如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

在其他地方已经注意到,连接到运行WPF应用程序的系统时发生的处理卸载/加载两步的方法,为避免出现问题,您应避免在您的初始化代码中再次输入“已加载”处理程序,所以我不在这里讨论这个主题。

我最近发现的是,发生这种情况时,控件在大多数情况下都保留其DataContract值。

那是说我最近发现有关ItemsControl的皱纹。

作为布局/渲染/重新加载过程的一部分,似乎完全重新评估了ItemsControl,并且当这种情况发生时,将完全重新创建并重新绑定模板化的元素。

对于上面的示例来说,这意味着在卸载/加载处理过程中,将删除现有的UniformGrid并取消分配其DataContract,并创建一个全新的实例,并为其分配DataContract。 / p>

接着,将“ CamerasList”重新绑定到ItemsSource,并将重复的ItemTemplate应用于列表中的每个项目。

从您提供的样本中我不知道这是否对您特别有问题。如果您遵循MVVM模式,通常会自行进行排序,但是如果视图中有任何代码后缀,则可能无法正确说明是否已换出并替换。