WPF如何刷新用户控件

时间:2014-08-22 02:50:10

标签: c# wpf

我试过了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();
}

2 个答案:

答案 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

祝你好运!