This-> DataContext не работает в uwp c / cf в visual studio 2019 на C

#c #uwp #visual-studio-2019 #uwp-xaml #datacontext

#c #uwp #visual-studio-2019 #uwp-xaml #datacontext

Вопрос:

Я использую UWP для создания приложения для серверного приложения, и я создал класс serverclass.h на c , в котором у меня есть строковый вывод. Теперь я хочу распечатать этот вывод в текстовом поле в xaml. Я приложил приведенные ниже коды. Когда я использую this-> DataContext=ser; он выдает мне сообщение об ошибке:»функция Windows ::UI::Xaml ::FrameworkElement::DataContext::set не может быть вызвана с заданным списком аргументов». В чем здесь проблема?

mainpage.xaml.cpp

 serverclass ser;

MainPage::MainPage()
{
    
    
    InitializeComponent();
    this->DataContext = ser;
}



void App1::MainPage::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    ser.output = "hey";
    ser.connect();
    
}
  

serverclass.h

 class serverclass
{
public:

    
    string output;

}

"mainpage.xaml"

<TextBox Text="{Binding output}" Height="50" FontSize="30px">
                
</TextBox>

  

Ответ №1:

Если вы хотите распечатать вывод строки в текстовом поле в xaml, вы можете использовать привязку данных, ссылающуюся на документ и образец.

Для упомянутого вами сценария вы можете проверить следующий код: serverclass.h

 namespace YourAppName{//Put the serverclass into the namespace
public ref class serverclass sealed : Windows::UI::Xaml::Data::INotifyPropertyChanged
{
private:
    Platform::String^ output;
public:
    virtual event Windows::UI::Xaml::Data::PropertyChangedEventHandler^ PropertyChanged;
    serverclass()
    {  }
    property Platform::String^ Output {
        Platform::String^ get() { return output; }
        void set(Platform::String^ value) {
            if (output != value)
            {
                output = value;
                PropertyChanged(this, ref new Windows::UI::Xaml::Data::PropertyChangedEventArgs("Output"));
            }
        }
    };
};
}
  

MainPage.xaml.h

 public ref class MainPage sealed
{
public:
       MainPage();
       property serverclass^ Ser {
             serverclass^ get() { return ser; }
             void set(serverclass^ value) {
                    ser = value;
             }
      }
   private:
          serverclass^ ser;
          void Button_Click(Platform::Object^ sender, 
          Windows::UI::Xaml::RoutedEventArgs^ e);
   };
  

MainPage.xaml.cpp

 MainPage::MainPage()
{
       InitializeComponent();
       this->ser = ref new serverclass();
       ser->Output = "world";
       this->DataContext = ser;
}
void DataContextSample::MainPage::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
       ser->Output = "hello";
}
  

MainPage.xaml

 <StackPanel>
    <TextBox Text="{x:Bind Ser.Output,Mode=TwoWay}"  Width="100" Height="30" Margin="10"/>
    <Button Click="Button_Click" Content="click me"/>
</StackPanel>
  

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

1. Приведенный выше код просто печатает «мир», а не «Привет».

2. Начальное значение ser->Output равно world , и значение будет изменено, как hello при нажатии кнопки, которая используется для проверки привязки TwoWay . Если вы нажмете на кнопку, а текст текстового поля не изменится, вы можете добавить точку останова в строке кода if(output!=value) в Output set() методе свойства, чтобы посмотреть, PropertyChanged срабатывает ли это.