将数据从一个窗口发送到另一个C#XAML WPF

时间:2019-10-07 09:04:41

标签: c# wpf xaml

我想将数据从窗口1的一个文本框发送到窗口2的标签。

从第二个窗口开始:

<StackPanel>
    <StackPanel x:Name="ButtonStackPanel" Height="Auto" Width="Auto">
        <StackPanel Orientation="Horizontal">
            <StackPanel Orientation="Vertical">
                <Button Style="{DynamicResource ButtonStyle}" Content="To The Dark Side" Click="OnClickToDarkSide"/>
                <Button Style="{DynamicResource ButtonStyle}" Content="To The Gray" Click="OnClickToGraySide"/>
                <Button Style="{DynamicResource ButtonStyle}" Content="To The Light Side" Click="OnClickToLightSide"/>
            </StackPanel>
            <Border HorizontalAlignment="Center" VerticalAlignment="Stretch" Background="Red" Height="Auto" Width="2"/>
            <Label Style="{DynamicResource LabelStyle}" x:Name="theTextBlock" Content="{Binding Source=CodeText}"/>
            <Border HorizontalAlignment="Center" VerticalAlignment="Stretch" Background="Red" Height="Auto" Width="2"/>
            <ToggleButton Style="{DynamicResource ToggleButtonStyle}" Content="Open Style Window" Name="StyleWindowButton" Click="OnClickOpenStyleWindow"/>
            <ToggleButton Style="{DynamicResource ToggleButtonStyle}" Content="Open Text Window" Name="TextWindowButton" Click="OnClickOpenTextWindow"/>
        </StackPanel>
        <Border Height="2" Width="Auto" Background="Red" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
    </StackPanel>
    <Border Height="2" Width="Auto" Background="Red" HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
</StackPanel>

第二个窗口后面的代码:

       public MainWindow()
        {
            (App.Current as App).CodeText = _jediCode;
            InitializeComponent();
        }

        private void OnClickToDarkSide(object sender, RoutedEventArgs e)
        {
            (App.Current as App).ChangeSkin(Skin.Dark);
            (App.Current as App).CodeText = _sithCode;
            theTextBlock.Content = (App.Current as App).CodeText;
        }

        private void OnClickToLightSide(object sender, RoutedEventArgs e)
        {
            (App.Current as App).ChangeSkin(Skin.Light);
            (App.Current as App).CodeText = _jediCode;
            theTextBlock.Content = (App.Current as App).CodeText;
        }

        private void OnClickToGraySide(object sender, RoutedEventArgs e)
        {
            (App.Current as App).ChangeSkin(Skin.Gray);
            (App.Current as App).CodeText = _grayCode;
            theTextBlock.Content = (App.Current as App).CodeText;
        }

        private void OnClickOpenStyleWindow(object sender, RoutedEventArgs e)
        {
            if (StyleWindowButton.IsChecked == true)
            {
                styleWindow = new StyleWindow();
                styleWindow.Show();
            }
            else

            {
                styleWindow.Close();
                styleWindow = null;
            }


        }

        private void OnClickOpenTextWindow(object sender, RoutedEventArgs e)
        {
            if (TextWindowButton.IsChecked == true)
            {
                textWindow = new InputWindow();
                textWindow.Show();
            }
            else

            {
                textWindow.Close();
                textWindow = null;
            }
        }
    }

第一个窗口:

<Grid>
        <TextBox HorizontalAlignment="Left" VerticalAlignment="Top" Height="200" Width="200" TextWrapping="Wrap" 
                 AcceptsReturn="True" AcceptsTab="True" Text="{Binding Path=CodeText, Source={x:Static Application.Current}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Margin="10,10,0,0">
            <!-- TODO: trigger change from this textbox to the textblock in mainwindow -->
        </TextBox>
    </Grid>

后面的代码为空。

app.xaml.cs:

public string CodeText
{
  get => _codeText;
  set { _codeText = value; OnPropertyChanged(nameof(CodeText)); }
}

好吧,当前行为是单击按钮之一(深色,灰色,浅色)导致CodeText属性发生变化,从而导致窗口二的标签内容和文本的变化。窗口一的文本框。更改TextBox的文本,还更改CodeText属性,但不会导致标签的更改,这很令人困惑,为什么它只能以一种方式起作用,而不能以另一种方式起作用。 希望你对我有个提示。 :)也许我错过了标签的触发条件或刷新

1 个答案:

答案 0 :(得分:1)

窗口1和2中的

绑定设置不同。 (第二个窗口做错了,Content="{Binding Source=CodeText}"无效绑定)

实际上,窗口2通过直接将CodeText分配为本地值来删除绑定:

theTextBlock.Content = (App.Current as App).CodeText;

您应该删除该行,并使用与窗口一中相同的绑定:

<Label Style="{DynamicResource LabelStyle}" x:Name="theTextBlock" 
       Content="{Binding Path=CodeText, Source={x:Static Application.Current}}"/>