代码之家  ›  专栏  ›  技术社区  ›  MartinHN

绑定到WPF ViewModel属性

  •  0
  • MartinHN  · 技术社区  · 15 年前

    我只是在玩WPF和MVVM,我制作了一个简单的应用程序,它显示一个矩形,每当网络可用性发生变化时,它就会改变颜色。

    但当这种情况发生时,我会得到这个错误: Cannot use a DependencyObject that belongs to a different thread than its parent Freezable.

    代码

    XAML

    <Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="400" Width="600">
    <DockPanel LastChildFill="True">
        <Rectangle x:Name="networkStatusRectangle" Width="200" Height="200" Fill="{Binding NetworkStatusColor}" />
    </DockPanel>
    </Window>
    

    代码落后

    使用system.windows; 使用wpfapplication1.viewModels;

    namespace WpfApplication1
    {
        /// <summary>
        /// Interaction logic for Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
                DataContext = new NetworkViewModel();
            }
        }
    }
    

    视图模型

    using System.ComponentModel;
    using System.Net.NetworkInformation;
    using System.Windows.Media;
    
    namespace WpfApplication1.ViewModels
    {
        public class NetworkViewModel : INotifyPropertyChanged
        {
            private Brush _NetworkStatusColor;
    
            public Brush NetworkStatusColor
            {
                get { return _NetworkStatusColor; }
                set
                {
                    _NetworkStatusColor = value;
                    NotifyOfPropertyChange("NetworkStatusColor");
                }
            }
    
            public NetworkViewModel()
            {
                NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged);
            }
    
            protected void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
            {
                if (e.IsAvailable)
                {
                    this.NetworkStatusColor = new SolidColorBrush(Colors.Green);
                }
                else
                {
                    this.NetworkStatusColor = new SolidColorBrush(Colors.Red);
                }
            }
    
            public event PropertyChangedEventHandler PropertyChanged = delegate { };
    
            public void NotifyOfPropertyChange(string propertyName)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    

    我假设应该通过调用某些内容来更改NetworkStatusColor属性?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Simon P Stevens    15 年前

    你的假设是正确的。这是 Dispatcher 类与 .Invoke 要查看的方法。

    有点像这样:

    if (this.Dispatcher.Thread != Thread.CurrentThread)
    {
        this.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(...your method...), any, params, here);
        return
    }
    

    有一个 MSDN article here 更多信息。

        2
  •  0
  •   Alex McBride    15 年前

    使用MVVM,在处理调度时有几个选项。您可以向视图发送某种消息,让它为您调用操作,或者您可以创建某种抽象的分派器服务,您可以轻松地模拟它。

    看看 MVVM Light 工具箱,因为它包括一个简单的调度器服务,您可以使用/复制。