Привязка к свойствам WPF ViewModel - PullRequest
0 голосов
/ 26 марта 2010

Я просто играю с 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();
        }
    }
}

ViewModel

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 ]

3 голосов
/ 26 марта 2010

Вы правильно предполагаете. Это класс Dispatcher и метод .Invoke , на который вы хотите взглянуть.

Что-то вроде этого:

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

Здесь есть статья MSDN с дополнительной информацией.

0 голосов
/ 26 марта 2010

С MVVM у вас есть несколько вариантов при работе с диспетчеризацией. Либо вы можете отправить какое-то сообщение вашему представлению, чтобы оно вызывало для вас операцию, либо вы можете создать некую абстрактную диспетчерскую службу, которую вы можете легко смоделировать.

Взгляните на MVVM Light инструментарий, так как он включает в себя простую диспетчерскую службу, которую вы можете использовать / копировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...