C# 如何在MVVM中重新加载视图?
我有一个ContentControl:(类名已更改) MVVM的INotifyPropertyChanged等已创建,并且一切正常 没错 有这样一个问题。当一个内容更改为另一个内容时, 但是对于同一个类,视图不会改变,它只会改变 数据 那些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
*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();