WPF liaison de données à la seconde vue

0

La question

J'ai passé un peu plus d'un Jour sur ce problème et je suis absolument aucune idée. Si je clique sur le bouton pour afficher le Second point de Vue, il s'Ouvre, mais sans Contenu. J'ai même pas par un point d'arrêt dans le Modèle de Vue. Pour cela, j'ai réduit le tout pour une zone de texte Simple et Textblock qui a fermé afficher les mêmes Données, mais ils ne le font pas. Ils ne montrent rien, même après avoir tapé dans la Boîte, le Bloc n'a pas de mise à jour. Mais ce que j'ai jamais essayer la liaison de données ne fonctionne pas. Est-ce quelqu'un a une Idée?

Merci d'Avance

Mon second point de Vue

<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>

Mon ViewModel

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

    public string FirstName
    {
        get
        {

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

Comment je les appelle tous les deux

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

ajout d'Informations

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

La meilleure réponse

0

Vous avez deux problèmes distincts:

1. En tapant dans la zone de texte ne change pas la propriété liée:

Cela est normal, puisque vous utilisez OneWay liant explicitement. OneWay liaison signifie que la propriété des mises à jour de l'interface utilisateur, mais pas l'inverse. Donc, changement de Prénom doit mettre à jour la zone de texte, mais le changement de la zone de texte n'est pas de mise à jour de Prénom.

Fait intéressant, si vous omettez simplement le Mode = OneWay la partie, il devrait fonctionner - depuis les zones de texte doit utiliser la liaison Bidirectionnelle par défaut. Je vous recommande de définir votre zone de texte liant explicitement que Mode = TwoWay

2. Votre point de vue initialise avec un vide TextBlock / zone de texte

Celui-ci est plus difficile à cerner, puisque vous ne nous montrez pas où vous définissez votre DataContext. C'est généralement le cas pour moi quand j'ai mis le DataContext APRÈS InitializeComponent()au lieu de l'avant. Vous définissez le DataContext avant que la liaison est initialisé (dans le cadre de InizializeComponent()), ou vous devez faire un NotifyPropertyChanged sur votre propriété pour mettre à jour l'INTERFACE utilisateur par la suite.

Si ce n'est pas la cause, vous souhaiterez peut-être activer WPF liaison des erreurs dans votre console de sortie - qui normalement vous donne une bonne idée de l'endroit où vos fixations échouer. Visual Studio a une option pour ça. Il devrait être situé ici:

Outils -> Options -> Options de Débogage -> Fenêtre de Sortie -> WPF Paramètres de Trace -> Liaison De Données -> Tous Les

2021-11-22 12:54:14

Tout d'abord, merci beaucoup pour votre Réponse.
rapta asdaf

Merci beaucoup! J'avais besoin de chercher un peu, mais je l'ai trouvé. "DataContext = new EditorViewModel();" est la ligne qui me manquait.
rapta asdaf

Ce n'est pas droit. Êtes-vous sûr d'une nouvelle instance de EditorViewModel est ce que vous voulez? Généralement, l'approche consiste à utiliser des DataContext = this; avant InitializeComponent();
Shrimperator

sûr? pas de. J'ai lu un peu et essayé ce qui a fonctionné. Ma solution donne le résultat souhaité. Si je remplace new EditorViewModel() avec this il ne fonctionne plus. Je ne sais pas si il est impuissant mais j'ai utilisé Caliburn.Micro dans le Projet. Juste pour information supplémentaire, j'ai ajouté la Catégorie en question dans le post.
rapta asdaf
0

Je crois que ce que vous tentez ici est de montrer votre seconde Vue (EditorView) dans la première (et pas comme un pop-up - si vous avez l'intention de l'avoir comme pop-up, utilisez WindowManager au lieu de ActivateItemAsync).

Une chose que vous devez modifier pour les rendre cela possible est d'assurer votre second point de Vue est un UserControl et pas une Fenêtre.

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

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

En outre, depuis l'utilisation de l' ActivateItemAsync, vous devez vous assurer que votre FirstView contient un ContendControl avec le Nom "ActiveItem".

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

L'appel à ActivateItemAsync utilisez ce contrôle à la charge de l'Affichage de votre deuxième ViewModel (EditorViewModel). Dans cet endroit, vous pouvez maintenant utiliser l' ActivateItemAsync méthode pour charger la Vue.

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

Veuillez noter que la méthode ActivateItemAsync prend en charge des appels asynchrones et il serait sage d'appeler la méthode asynchrone.

Un autre point à noter est que vous n'avez pas besoin de spécifier le DataContext explicitement comme on le voit dans l'OP, si vous utilisez Caliburn Micro et le Viewmodel sont stockés dans le répertoire recommandé/espaces de noms structures. Caliburn Micro utilise des conventions de nommage pour associer le approprié view-viewmodel paires. Plus d'informations sur le même pu être trouvée dans la documentation officielle

2021-11-23 06:48:07

Dans d'autres langues

Cette page est dans d'autres langues

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