WPF Databinding a seconda vista

0

Domanda

Ho passato poco più di un Giorno su questo problema e sono assolutamente all'oscuro. Se clicco il pulsante per visualizzare la Seconda parte si Apre, ma senza Contenuto. Ho anche da un punto di interruzione nel Modello di Visualizzazione. Per questo ho ridotto il tutto ad una Semplice casella di testo e Textblock che chiudere visualizzare gli stessi Dati, ma non è così. Essi mostrano niente, anche dopo aver digitato nella Casella di Blocco non si aggiorna. Ma che cosa mai cerco il Databinding non Funziona. Qualcuno ha un'Idea?

Grazie in Anticipo

Il mio secondo punto di 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>

Il Mio ViewModel

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

    public string FirstName
    {
        get
        {

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

Come mi chiamano entrambi

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

aggiunta di Informazioni

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

Migliore risposta

0

Hai due problemi distinti:

1. Digitando nella casella di testo non cambia la proprietà associata di:

Questo è prevedibile, dal momento che si utilizzano OneWay associazione in modo esplicito. Senso unico mezzo di proprietà aggiornamenti dell'interfaccia utente, ma non l'altro senso intorno. In modo da cambiare il Nome dovrebbe aggiornare la casella di testo, ma cambiando la TextBox non aggiorna il Nome.

È interessante notare che, se si omette il Mode = OneWay parte, dovrebbe funzionare - poiché Caselle di testo dovrebbe utilizzare Reciproca vincolante per impostazione predefinita. Mi consiglia di definire la TextBox associazione in modo esplicito come Mode = TwoWay

2. La vista inizializza con un vuoto TextBlock / TextBox

Questo è più difficile da definire, dal momento che non ci mostrano dove si imposta la proprietà DataContext. Questo di solito accade a me quando ho impostato il DataContext DOPO InitializeComponent()invece di prima. Di impostare il DataContext prima l'associazione è inizializzata (come parte di InizializeComponent()), o devi alzare un NotifyPropertyChanged sulla vostra proprietà per aggiornare l'interfaccia utente in seguito.

Se questa non è la causa, potrebbe essere necessario abilitare associazione di WPF errori nella console di output che di solito ti dà una buona idea di dove le associazioni non riescono. Visual Studio è un opzione per questo. Dovrebbe essere qui:

Strumenti -> Opzioni -> Debug -> Finestra di Output -> WPF Impostazioni di Traccia -> L'Associazione Dati -> Tutti

2021-11-22 12:54:14

Prima di tutto, la ringrazio molto per la tua Risposta.
rapta asdaf

Grazie mille! Ho avuto bisogno di cercare un po', ma l'ho trovato. "DataContext = new EditorViewModel();" è la linea che mi mancava.
rapta asdaf

Che non ha il suono giusto. Sei sicuro che una nuova istanza di EditorViewModel è quello che vuoi? Di solito, l'approccio è quello di utilizzare DataContext = this; prima InitializeComponent();
Shrimperator

sicuro? no. Ho letto un po ' e provato che cosa ha funzionato. La mia soluzione si ottiene il risultato desiderato. Se posso sostituire new EditorViewModel() con this non funziona più niente. Non so se è impotente, ma ho usato Caliburn.Micro nel Progetto. Solo per una maggiore informazione, ho aggiunto la Classe in questione nel post.
rapta asdaf
0

Credo che quello che si sta tentando di dimostrare il tuo secondo punto di Vista (EditorView) entro il primo (e non come un pop-up se si desidera avere come popup, utilizzare WindowManager invece di ActivateItemAsync).

Una cosa bisogna modificare per rendere questo possibile è quello di garantire il secondo punto di Vista è un UserControl e non una Finestra.

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

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

Anche perché con la vostra ActivateItemAsyncsi avrebbe bisogno di assicurarsi che il FirstView contiene un ContendControl con Nome "ActiveItem".

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

La chiamata a ActivateItemAsync utilizzare questo controllo per caricare la Visualizzazione del secondo ViewModel (EditorViewModel). A questo punto, si può usare la ActivateItemAsync metodo per caricare la Vista.

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

Siete pregati di notare che il metodo di ActivateItemAsync supporta le chiamate asincrone e sarebbe saggio per chiamare il metodo asincrono.

Un altro punto da notare è che non è necessario specificare il DataContext esplicitamente come si è visto in OP se si sta utilizzando Caliburn Micro e la Vista/ViewModels sono memorizzati nella cartella consigliata gli spazi dei nomi strutture. Caliburn Micro utilizza le convenzioni di denominazione per associare determinati view-viewmodel coppie. Più informazioni su lo stesso può essere trovato nella documentazione ufficiale

2021-11-23 06:48:07

In altre lingue

Questa pagina è in altre lingue

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