Как сделать свойство зависимости статичным? - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть свойство зависимости под названием xpos с привязкой к текстовому полю.Я смог без проблем отобразить значение моего свойства зависимости в текстовом поле.Однако у меня есть Arduino, с которым я говорю поочередно.Я использую другой поток, чтобы прочитать любые входящие данные.В этом потоке предполагается, что некоторые данные изменят свойство my зависимости.Проблема заключается в том, что функция, выполняемая потоком, является статической, а свойство зависимости не является статическим.Я не могу вызвать свойство в этой функции.

Я пытался сделать свойство статичным, но это вызвало другие ошибки.

<TextBox Grid.Column="1" Grid.Row="0" HorizontalAlignment="Left" Height="20" TextWrapping="Wrap" VerticalAlignment="Center" Width="50" Margin="12.4,10,0,10" Name="Xdisplay" Text="{Binding xpos, ElementName=CurrentWindow}" IsReadOnly="True" TextChanged="Xdisplay_TextChanged"/>
Thread Readthread = new Thread(Read);
static public Boolean _continue = true;
static public SerialPort com;
com.BaudRate = Convert.ToInt32(Rates.Text);
com.PortName = Ports.
com.Open();
MessageBox.Show("Connection Successful");
Readthread.Start();


public static readonly DependencyProperty xposproperty =
            DependencyProperty.Register("xpos", typeof(float), typeof(Window), new PropertyMetadata(null));

        public float xpos
        {
            get { return (float)GetValue(xposproperty); }
            set { SetValue(xposproperty, value); }
        }



 public static void Read()
        {
            while (_continue)
            {
                try
                {
                    string message = com.ReadLine();
                    if(message.Contains("max limit reached"))
                    {
                        MessageBox.Show(message);
                        switch (message.Substring(0))
                        {
                            case "x":
                                max = true;
                                xpos = int.Parse(message.Substring(20, message.Length));
                                break;

                            case "y":
                                ypos = int.Parse(message.Substring(20, message.Length));
                                break;
                        }


                    }
                    Console.WriteLine(message);
                }
                catch (TimeoutException) { }
            }
        }

1 Ответ

2 голосов
/ 30 апреля 2019

Свойства зависимостей - не лучшая вещь для этого, в WPF 4.5 вы можете привязывать напрямую к статическим свойствам вместо этого:

public class MainViewModel : ViewModelBase
{
    public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;

    private static double _XPos;
    public static double XPos
    {
        get { return _XPos; }
        set
        {
            if (_XPos != value)
            {
                _XPos = value;
                StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs("XPos"));
            }
        }
    }

    public MainViewModel()
    {
        // simulate values being read by the serial port
        Task.Run(async () =>
        {
            var rng = new Random();
            while (true)
            {
                await Task.Delay(TimeSpan.FromMilliseconds(500));
                XPos = rng.Next();
            }
        });
    }
}

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

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