Ligação de dados do WPF para a segunda vista

0

Pergunta

Eu tenho gastar um pouco mais de um Dia sobre esse problema e estou absolutamente sem noção. Se eu clicar no botão para mostrar a Visão Segundo ele Abre, mas sem Conteúdo. Eu até obter um ponto de interrupção no Modelo de modo de Exibição. Por isso eu tenho reduziu tudo a uma Simples caixa de Texto e Textblock que fecham exibir os mesmos Dados, mas eles não. Eles mostram nada, mesmo depois de Digitar na Caixa o Bloco não atualização. Mas o que eu nunca mais vou tenta a ligação de dados não Funciona. Alguém tem uma Idéia?

Obrigado Antecipadamente

Minha segunda Vista

<Window x:Class="AoE4_BO_Overlay.Views.EditorView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:AoE4_BO_Overlay.Views" xmlns:viewmodels="clr-namespace:AoE4_BO_Overlay.ViewModels" d:DataContext="{d:DesignInstance Type=viewmodels:EditorViewModel}"
    mc:Ignorable="d"
    Title="EditorView" Height="450" Width="800">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="auto" />
        <ColumnDefinition Width="20" />
        <ColumnDefinition Width="20" />
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>
        <RowDefinition Height="20" />
        <RowDefinition Height="auto" />
        <RowDefinition Height="auto" />
        <RowDefinition Height="20" />
    </Grid.RowDefinitions>
    <TextBlock Text="{Binding Path=FirstName}" Grid.Column="0" Grid.Row="2"/>
    <TextBox Text="{Binding Path=FirstName , Mode=OneWay}" Grid.Column="0" Grid.Row="1"/>
</Grid>

Meu ViewModel

    internal class EditorViewModel : Conductor<object>
{
    private string _firstName = "Tom";
    public EditorViewModel()
    {
    }

    public string FirstName
    {
        get
        {

            return _firstName;
        }
        set
        {
            _firstName = value;
            NotifyOfPropertyChange(() => FirstName);
        }
    }
}

Como eu chamo eles

        public void CreateBO_Click(object sender, RoutedEventArgs e)
    {
        EditorView createBO = new EditorView();
        ActivateItemAsync(new EditorViewModel());
        createBO.Show();
    }

Informações adicionais

    public partial class EditorView : Window
{
    public EditorView()
    {
        DataContext = new EditorViewModel();
        InitializeComponent();
    }
}
c# caliburn.micro data-binding wpf
2021-11-22 11:39:16
2

Melhor resposta

0

Você tem dois problemas separados:

1. Digitar na caixa de texto não alterar a propriedade vinculada:

Isso é esperado, uma vez que você usar OneWay explicitamente. OneWay significa a propriedade de atualizações de interface do usuário, mas não a outra maneira ao redor. Por isso, a mudança de Nome deve atualizar a caixa de Texto, mas alterando o Texto não atualizar o Nome.

Curiosamente, se você apenas omita a Mode = OneWay parte, ele deve funcionar - desde caixas de Texto devem usar TwoWay por padrão. Eu recomendo que você defina o seu Texto enlace explicitamente como Mode = TwoWay

2. Sua visão inicializa com um vazio TextBlock / caixa de Texto

Este é mais difícil de fixar para baixo, desde que você não mostre-nos onde você define o seu DataContext. Isso geralmente acontece comigo quando eu definir o DataContext DEPOIS InitializeComponent(), em vez de antes. Você quer definir o DataContext antes que a vinculação é inicializado (como parte de InizializeComponent()), ou você tem para levantar um NotifyPropertyChanged em sua propriedade para atualizar a INTERFACE do usuário depois.

Se esta não é a causa, poderá pretender activar a ligação do WPF erros no console de saída - que, geralmente, dá uma boa idéia de onde suas ligações falhar. O Visual Studio tem uma opção para isso. Ele deve estar localizado aqui:

Ferramentas -> Opções -> Depuração> Janela de Saída -> WPF Configurações de Rastreamento -> Ligação De Dados -> Todos Os

2021-11-22 12:54:14

Primeiro de tudo, muito obrigado por sua Resposta.
rapta asdaf

Muito obrigado! Eu precisava procurar um pouco, mas eu achei. "DataContext = new EditorViewModel();" é a linha que eu estava ausente.
rapta asdaf

Que não parece certo. Tem a certeza de uma nova instância de EditorViewModel é o que você quer? Geralmente, a abordagem é a utilização de DataContext = this; antes de InitializeComponent();
Shrimperator

tem certeza? não. Eu li um pouco e tentou, qual funcionou. A minha solução produz o resultado desejado. Se eu substituir new EditorViewModel() com this ele não funciona mais. Eu não sei se ele é impotente, mas eu usei Caliburn.Micro no Projeto. Apenas para informação extra que eu adicionei a Classe em questão no post.
rapta asdaf
0

Eu acredito no que você está tentando aqui é mostrar a sua segunda Vista (EditorView) dentro do primeiro (e não como um pop-up se você pretende ter como pop-up, use WindowManager em vez de ActivateItemAsync).

Uma coisa que você precisa mudar para tornar isso possível é para garantir a sua segunda Vista é um UserControl e não uma Janela.

// EditorView.xaml.cs
public partial class EditorView : UserControl

// EditView.xaml
<UserControl x:Class="AoE4_BO_Overlay.Views.EditorView"

Também desde o seu, utilizando o ActivateItemAsyncvocê precisa garantir que o seu FirstView contém um ContendControl com o Nome de "ActiveItem".

// FirstView.xaml
<ContentControl x:Name="ActiveItem"/>

A chamada para ActivateItemAsync gostaria de usar esse controle para carregar a Exibição de seu segundo ViewModel (EditorViewModel). Com isso no lugar, você pode agora usar o ActivateItemAsync método para carregar o modo de Exibição.

public async Task CreateBO_Click(object sender, RoutedEventArgs e)
{
   await ActivateItemAsync(new EditorViewModel());
}

Por favor, note que o método ActivateItemAsync suporta chamadas assíncronas e seria sábio para chamar o método de forma assíncrona.

Outro ponto a se notar é que você não precisa especificar o DataContext explicitamente como visto na OP se você estiver usando Caliburn Micro e o modo de Exibição/ViewModels são armazenados na pasta recomendada/espaços de nomes de estruturas. Caliburn Micro usa convenções de atribuição de nomes para associar o adequado view-viewmodel pares. Mais informações sobre o mesmo poderia ser encontrado na documentação oficial

2021-11-23 06:48:07

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................