制作了一个 dummyapp 来说明我在现实世界应用程序中遇到的问题:
我有一个 WPF 用户控件,内容如下:
<UserControl.DataContext>
<local:ViewModel/>
</UserControl.DataContext>
<StackPanel>
<Button Content="Add to collection!" Command="{Binding AddCommand}"/>
<ItemsControl ItemsSource="{Binding Path=Collection}"/>
</StackPanel>
Datacontext 是这样的 ViewModel:
public class ViewModel : INotifyPropertyChanged
{
public ObservableCollection<string> Collection { get; set; }
public ICommand AddCommand { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
public ViewModel()
{
Collection = new ObservableCollection<string>
{
"string number 1",
"string number 2"
};
int counter = 3;
AddCommand = new RelayCommand(x =>
{
Collection.Add($"Added string number {counter}");
counter++;
});
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
RelayCommand 实现 ICommand。单击添加按钮时,“AddCommand”运行,并将一个项目添加到集合中,绑定到 xaml ItemsControl。我已将 UserControl 放在一个自动调整大小的 ElementHost 中,停靠在我的 Forms 应用程序中的“顶部”,如下所示:
public Form1()
{
InitializeComponent();
var elementHost = new ElementHost()
{
Dock = DockStyle.Top,
AutoSize = true
};
elementHost.Child = new WpfUserControl();
Controls.Add(elementHost);
}
当我启动程序时控件显示正确 - 但我的问题是:如果我调整或最大化窗口然后按下按钮,用户控件将不会得到更新/调整大小!...直到我手动调整托管窗口的大小!因此,只有在更改托管窗口的大小后,elementhost 才会调整大小以适应新添加的内容。
试图使用一些事件来强制宿主表单在 UserControl 上更新()/更新布局()等等,但没有成功。在不同的系统上试过这个,我总是得到相同的结果。非常令人沮丧...