Реактивный фреймворк и INotifyPropertyChanged с Silverlight

#.net #silverlight-4.0

#.net #silverlight-4.0

Вопрос:

Я новичок в RX Framework. Я играюсь с этим, пытаясь обновить текстовое поле Silverlight при обновлении свойства с помощью INotifyPropertyChanged. Мой XAML выглядит следующим образом:

  <Canvas x:Name="LayoutRoot" Background="White">
        <Border BorderThickness="2" CornerRadius="5" BorderBrush="Blue" Canvas.Left="12" Width="371">
            <TextBlock Height="135" HorizontalAlignment="Left" Margin="12,50,0,0" Name="textBlock1" 
                       Text=""
                       VerticalAlignment="Top" Width="367" />
        </Border>
        <Button Content="Post!" Height="23" HorizontalAlignment="Left" Margin="12,210,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
        <TextBox Height="41" 
                 HorizontalAlignment="Left" 
                 Margin="12,247,0,0" 
                 Name="textBox1" 
                 VerticalAlignment="Top" 
                 Width="376" 
                 />
        <sdk:Label Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="label1" VerticalAlignment="Top" Width="120" Content="Post Window" FontWeight="Bold" FontSize="12" Canvas.Left="14" Canvas.Top="0" />
    </Canvas>
  

В моем коде позади, у меня есть:

 public partial class MainPage : UserControl
    {
        Messanger messanger;

        public MainPage()
        {
            InitializeComponent();

        }

        void messanger_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            var textBoxInput = from evt in Observable.FromEvent<PropertyChangedEventArgs>(messanger, "PropertyChanged")
                               select evt.EventArgs.PropertyName.Equals("PropertyName");

            textBoxInput.Subscribe(value => textBlock1.Text = value.ToString());
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            messanger = new Messanger();

            messanger.PropertyChanged  = new PropertyChangedEventHandler(messanger_PropertyChanged);

            messanger.Message = textBox1.Text;
        }

    }
  

и я создал другой класс для обработки событий изменения свойств

  public class Messanger : INotifyPropertyChanged
    {
        private string MessageValue;

        public string Message
        {
            get { return MessageValue; }
            set
            {
                MessageValue = value;

                NotifyPropertyChanged("Message");
            }
        }
        public void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }  
        public event PropertyChangedEventHandler PropertyChanged;
    }
  

Моя проблема в том, что я не получаю выходные данные в текстовом блоке из того, что я поместил в текстовое поле. Также дайте мне знать, если я использую его неправильно…

Есть идеи? Заранее спасибо!

Ответ №1:

Попробуйте привязать текст текстового блока к текстовому полю следующим образом

 ...
<TextBlock Height="135" HorizontalAlignment="Left" Margin="12,50,0,0" Name="textBlock1" 
                       Text="{Binding ElementName=textBox1,Path=Text}"
                       VerticalAlignment="Top" Width="367" />
...
<TextBox Height="41" 
                 HorizontalAlignment="Left" 
                 Margin="12,247,0,0" 
                 Name="textBox1" 
                 VerticalAlignment="Top" 
                 Width="376" 
                 />
  

Комментарии:

1. Разве это не помешало бы цели использования фреймворка Rx и наблюдаемого?

2. Я так не думаю, вам следует выполнять правильные привязки к для визуализации правильных данных

3. То, что вы делаете, это просто привязка текстового поля к текстовому блоку. Это нормально, но не то, что я хочу делать. Я хочу, чтобы Oberserver передавал данные мне (имеется в виду текстовый блок)

Ответ №2:

Если вы заинтересованы в использовании reactive Framework с Silverlight, возможно, вам захочется ознакомиться с реактивным пользовательским интерфейсом.