我试过了UIElement.InvalidateVisual
,但它没有用。我读到了这个INotifyPropertyChanged
,但我不确切知道它是如何使用的,更不用说我正在谈论用户控件,似乎我需要将INotifyPropertyChanged
用于所有控件。
我在刷新组合框更改和数据网格更改时遇到了问题,我所做的是关闭并重新打开表单,但我不想要这种方法,因为在重新执行每个用户控件构造函数时看起来很迟钝。
这是我的代码:
if (linkSource.ToString() == "BreedList.xaml")
{
this.InvalidateVisual();
}
else if (linkSource.ToString() == "PetTypeList.xaml")
{
this.InvalidateVisual();
}
else if (linkSource.ToString() == "IrritantList.xaml")
{
this.InvalidateVisual();
}
答案 0 :(得分:3)
这个答案试图让你看一看WPF应用程序是如何工作的,但是我不提供教你WPF ......那是你的工作。
正如@HighCore正确指出的那样,没有UserControl.Refresh
方法。在WPF应用程序(使用MVVM)中,我们创建称为视图模型的自定义类对象,其中包含UserControl
和/或Window
s(称为视图)需要提供的数据和功能。通过将视图DataContext
属性设置为相关视图模型的实例来配对它们。有几种方法可以做到这一点......这只是一种方式:
public SomeView()
{
...
DataContext = new SomeViewModel();
}
现在,SomeView
中声明的所有控件都可以访问public
类中的所有(ICommand
)属性和SomeViewModel
。我们将它们用于数据绑定:
<TextBox Text="{Binding SomePropertyInSomeViewModel}" ... />
...
<ListBox ItemsSource="{Binding SomeCollectionPropertyInSomeViewModel}" />
在初始化SomeViewModel
课程期间,我们可能会看到类似这样的内容:
public SomeViewModel()
{
SomeCollectionPropertyInSomeViewModel = SomeDataSource.GetSomeCollection();
}
这将从任何外部数据源获取数据并填充SomeCollectionPropertyInSomeViewModel
属性。反过来,SomeCollectionPropertyInSomeViewModel
属性提供ListBox
的集合项。最后,回答你的问题,我们如何刷新数据?,答案是调用再次获取数据的方法。所以你可以这样做:
public void RefreshData()
{
SomeCollectionPropertyInSomeViewModel = SomeDataSource.GetSomeCollection();
}
好的,所以这里结束了今天的教训。有关任何进一步的问题,请参阅MSDN上正确的Microsoft文档。有关后续信息,请参阅MSDN上的Introduction to WPF页面。
答案 1 :(得分:1)
要添加到上一个答案:有两种方法可以创建&#34; SomeViewModel&#34;。它应该以两种方式通知房产变更。
1)使用DependencyObject。这是一种标准的WPF方式,所有UserControls也都是DependencyObjects。从这里开始,阅读完整的解释:http://wpftutorial.net/DependencyProperties.html
public class SomeViewModel : DependencyObject
{
// Dependency Property
public static readonly DependencyProperty CurrentTimeProperty =
DependencyProperty.Register("CurrentTime", typeof(DateTime),
typeof(SomeViewModel), new FrameworkPropertyMetadata(DateTime.Now));
// .NET Property wrapper
public DateTime CurrentTime
{
get { return (DateTime)GetValue(CurrentTimeProperty); }
set { SetValue(CurrentTimeProperty, value); }
}
}
当CurrentTime更改所有注册的人(例如在XAML中使用{Binding CurrentTime}时)将收到通知并且&#34;刷新&#34;
2)使用INotifyPropertyChanged接口。这是一个小例子: http://msdn.microsoft.com/en-us/library/vstudio/ms229614(v=vs.100).aspx
这些方法之间存在一些差异(例如,您无法创建绑定到 INotifyPropertyChanged属性)。请在这里阅读: http://www.codeproject.com/Articles/62158/DependencyProperties-or-INotifyPropertyChanged INotifyPropertyChanged vs. DependencyProperty in ViewModel
祝你好运!