Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在MVVM中重新加载视图?_C#_Wpf_Mvvm_Reload - Fatal编程技术网

C# 如何在MVVM中重新加载视图?

C# 如何在MVVM中重新加载视图?,c#,wpf,mvvm,reload,C#,Wpf,Mvvm,Reload,我有一个ContentControl:(类名已更改) MVVM的INotifyPropertyChanged等已创建,并且一切正常 没错 有这样一个问题。当一个内容更改为另一个内容时, 但是对于同一个类,视图不会改变,它只会改变 数据 那些 *XAML:* ContentControl Content="{Binding CurrentContent}" I change the CurrentContent like this: CurrentContent = n

我有一个ContentControl:(类名已更改)

MVVM的INotifyPropertyChanged等已创建,并且一切正常 没错

有这样一个问题。当一个内容更改为另一个内容时, 但是对于同一个类,视图不会改变,它只会改变 数据

那些

*XAML:*
ContentControl
            Content="{Binding CurrentContent}"
 I change the CurrentContent like this:

CurrentContent = new ContentOne();
CurrentContent = new ContentTwo();
在第二种情况下,视图保持不变

这会导致问题,因为视图中有一个列表框ItemPanel 它代表包装纸。对于所有WP儿童,身高和身高 宽度相同,并在视图初始化期间设置 通过寻找最大的宽度和高度。当ViewModel 更改,但视图不更改,可能会发生以下情况:

*1的视图:

*2的视图:

您将无法重新计算高度和宽度,因为它们 当尚未为WrapPanel设置它们时,将考虑 在*2的情况下,它们已设置

注意:在这种情况下,一切正常:

CurrentContent = new ContentOne(); //1
---over time
CurrentContent = new ContentOne(); //2

您需要使用UniformGrid而不是WrapPanel。

“高度和宽度相同,并且在视图初始化期间通过查找最大宽度和高度来设置”——XAML已损坏。不要这样设置宽度和高度。您的代码隐藏应该没有任何布局、对齐、宽度等代码。您可以使用WPF布局技术(如网格、水平对齐、垂直对齐等)完成所有这些工作。因此,它将在需要时自动更新。如果您向我们展示存在问题的XAML,我们可以帮助您解决问题,这样就不会出现问题。如果您完全无法编写正确的XAML,请创建DataContextChanged事件处理程序,并从此处调用布局代码。请发布您的实际代码。你在寻求帮助,但你每一步都在与我抗争。我找到了解决办法。您需要使用UniformGrid而不是WrapPanel。更感谢你,尽管我能力不足,你还是试着帮助我!:-)杰出的在WPF中,几乎总是有一种简单的方法使布局只做您想要的,而不需要任何代码。
private void ListBoxWrapPanel_Loaded(object sender, RoutedEventArgs e)
{
    if (!(sender is WrapPanel panel))
        return;
    if (panel.Children.Count == 0)
        return;

    var max = (from FrameworkElement panelChild in panel.Children
            select panelChild.ActualWidth + panelChild.Margin.Left + panelChild.Margin.Right)
        .Concat(new double[] { 0 }).Max();
    panel.ItemWidth = max;
}
*XAML:*
ContentControl
            Content="{Binding CurrentContent}"
 I change the CurrentContent like this:

CurrentContent = new ContentOne();
CurrentContent = new ContentTwo();
CurrentContent = new ContentOne(); //1
---over time
CurrentContent = new ContentOne(); //2
CurrentContent = new ContentOne();
---over time
CurrentContent = new ContentTwo();
---over time
CurrentContent = new ContentOne();