Enlace de datos de WPF a segunda vista

0

Pregunta

He pasado un poco más de un Día sobre este problema y estoy absolutamente Desorientado. Si hago clic en el botón para mostrar el Segundo punto de Vista se Abre, pero sin Contenido. Yo me pongo por un punto de ruptura en el Modelo de Vista. Para esto he reducido todo a un Simple cuadro de texto y Textblock que se cierran mostrar los mismos Datos, pero no. No muestran nada incluso después de Escribir en la Caja que el Bloque no se actualiza. Pero lo que nunca puedo probar el Enlace de datos no funciona. ¿Alguien tiene una Idea?

Gracias de Antemano

Mi segundo punto de 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>

Mi ViewModel

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

    public string FirstName
    {
        get
        {

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

Cómo me llame tanto de ellos

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

se agregó Información

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

Mejor respuesta

0

Tienes dos cuestiones distintas:

1. Escribir en el cuadro de texto no cambia la propiedad enlazada:

Esto es el esperado, ya que el uso de una vía de unión de forma explícita. Una vía de unión significa la propiedad de las actualizaciones de la interfaz de usuario, pero no la otra manera alrededor. Lo que el cambio de Nombre debe actualizar el cuadro de texto, pero cambiar el cuadro de texto no actualizar el Nombre.

Curiosamente, si usted acaba de omitir la Mode = OneWay parte, se debe trabajar - desde cuadros de texto debe utilizar TwoWay de enlace por defecto. Te recomiendo que definir su cuadro de texto de unión explícitamente como Mode = TwoWay

2. Su vista se inicializa con un vacío TextBlock / TextBox

Este es más difícil de precisar, ya que no nos muestran donde se define su DataContext. Esto por lo general sucede a mí cuando me puse el DataContext DESPUÉS de InitializeComponent()en lugar de antes. Establece el DataContext antes de que la unión se inicializa (como parte de InizializeComponent()), o tienes que subir una NotifyPropertyChanged en su propiedad para la actualización de la interfaz de usuario después.

Si esta no es la causa, es posible que desee habilitar WPF unión errores en la salida de la consola - que por lo general se da una buena idea de donde los enlaces fallan. Visual Studio tiene una opción para eso. Debería estar aquí:

Herramientas -> Opciones -> Depuración -> Ventana de Salida -> Configuración de Seguimiento de WPF -> Enlace De Datos -> Todos Los

2021-11-22 12:54:14

Primero de todo, muchas gracias por tu Respuesta.
rapta asdaf

Muchas gracias! Necesitaba buscar un poco, pero lo he encontrado. "DataContext = new EditorViewModel();" es la línea que me estaba perdiendo.
rapta asdaf

Que no suena bien. Está usted seguro de que una nueva instancia de EditorViewModel es lo que quieres? Generalmente, el enfoque es el uso de DataContext = this; antes de InitializeComponent();
Shrimperator

seguro? no. He leído un poco y trató de lo trabajado. Mi solución produce el resultado deseado. Si puedo reemplazar new EditorViewModel() con this ya no funciona. No sé si es impotente, pero he usado Caliburn.Micro en el Proyecto. Sólo para información adicional a la que he añadido la Clase en cuestión en el post.
rapta asdaf
0

Yo creo que lo que se intenta aquí es mostrar a su segundo punto de Vista (EditorView) dentro de la primera (y no como una ventana pop-up si va a tener como emergente, utilice WindowManager en lugar de ActivateItemAsync).

Una cosa que hay que cambiar para que esto sea posible es para asegurarse de que su segundo punto de Vista es un control de usuario y no de una Ventana.

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

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

También, a partir de su uso de la ActivateItemAsync, usted necesita para asegurarse de que su FirstView contiene un ContendControl con el Nombre "ActiveItem".

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

La llamada a ActivateItemAsync utilice este control para cargar el punto de Vista de su segundo ViewModel (EditorViewModel). Con esto, ahora se puede utilizar el ActivateItemAsync método de carga de la Vista.

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

Por favor, tenga en cuenta que el método de ActivateItemAsync soporta llamadas asincrónicas y sería prudente llamar al método de forma asincrónica.

Otro punto a tener en cuenta es que usted no necesita especificar el DataContext explícitamente como se ve en la cooperativa si usted está usando Caliburn Micro y la Vista/ViewModels se almacenan en las carpetas/espacios de nombres de estructuras. Caliburn Micro utiliza las convenciones de nomenclatura para asociar el adecuado view-viewmodel pares. Más información sobre el mismo puede ser encontrado en la documentación oficial

2021-11-23 06:48:07

En otros idiomas

Esta página está en otros idiomas

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