Попытка изменить DataContext главного окна из usercontrol - PullRequest
0 голосов
/ 13 ноября 2018

При инициализации главного окна я устанавливаю DataContext на usercontrol, и в этом usercontrol у меня есть событие, которое предполагает изменение datacontext главного окна на другой usercontrol, но ничего не происходит.

Вот xaml для главного окна:

</Window.Resources>
<Grid>
    <ContentControl Content="{Binding}" Width="auto" Height="auto" />
</Grid>

Вот C # для главного окна:

public MainWindow()
    {
        InitializeComponent();
        DataContext = new LogInViewModel();
    }

Вот xaml для LogInUserControl:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <StackPanel Grid.Column="1" Grid.Row="1">
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Width="250">
            <StackPanel Width="125">
                <TextBlock Text="Email:" Margin="5,0,5,0" Width="auto"/>
            </StackPanel>
            <StackPanel Width="125">
                <TextBlock Text="Password:" Margin="5,0,0,0" Width="auto"/>
            </StackPanel>
        </StackPanel>
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
        <TextBox Margin="5,0,5,0" HorizontalAlignment="Center" Height="23" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
        <PasswordBox Margin="0,0,0,5" HorizontalAlignment="Center" Height="23" VerticalAlignment="Top" Width="120"/>
        </StackPanel>
        <Button Content="Log In" Margin="0,0,0,5" HorizontalAlignment="Center" VerticalAlignment="Top" Width="75"/>
    </StackPanel>
    <Grid Grid.Column="1" Grid.Row="1">
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
        <TextBlock Text="don't have account yet ?" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="5"/>
        <TextBlock Name="TBSignUp" Text="Sign Up" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="5" PreviewMouseLeftButtonDown="TextBlock_PreviewMouseLeftButtonDown" PreviewMouseLeftButtonUp="TextBlock_PreviewMouseLeftButtonUp" Foreground="#FF0B36F5"/>
        </StackPanel>
    </Grid>
</Grid>

а вот C # для LogInUserControl:

public partial class LogInView : UserControl
{
    string BlackForeground = "#FF000000" ;
    string OriginalForeground = "#FF0B36F5";
    public LogInView()
    {
        InitializeComponent();
    }

    private void TextBlock_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        TBSignUp.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString(OriginalForeground));
        DataContext = new RegisterView();
    }

    private void TextBlock_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        TBSignUp.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString(BlackForeground));
    }
}

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

В WPF вы можете получить окно оболочки (первое) из любого места:

System.Windows.Window shell = System.Windows.Application.Current.MainWindow;

ИЛИ

 Application.Current.Windows[0];

, но я рекомендую при необходимости передать ссылку.

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

0 голосов
/ 13 ноября 2018

Вам нужно установить его на App.xaml.cs.

App.xaml.cs:

public class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
         MainWindow window=new MainWindow();
         LogInViewModel vm=new LogInViewModel(); // You need to set DataContext...
         window.DataContext=vm; // ...before showing up the window.
         window.Show();
    }
 }

В шаблонах ViewModel, которые я нашел в исследовании,использование до DataContext, после Show();.

Я надеюсь, что это решит вашу проблему.

...