Wiązanie danych WPF do drugiego widoku

0

Pytanie

Wydałem na ten problem nieco więcej dni i nic nie rozumiem. Jeśli nacisnę przycisk, aby wyświetlić drugi rodzaj, to zostanie on otwarty, ale bez zawartości. Ja nawet przechodzę punkt przerwania w modelu prezentacji. Do tego doprowadził wszystko do zwykłego pola tekstowego i blokowi tekstu, które wyświetlają się te same dane, ale oni tego nie robią. Oni nic nie widać, nawet po wpisaniu w polu Jednostka nie jest aktualizowany. Ale co bym nie próbował, wiązanie danych nie działa. Czy ktoś ma pomysł?

z góry dziękuję

Mój drugi Rzut oka

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

Mój model oglądania

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

    public string FirstName
    {
        get
        {

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

Jak ja nazywam ich obu

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

dodatkowe informacje

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

Najlepsza odpowiedź

0

Masz dwa odrębne problemy:

1. Enter w polu tekstowym nie zmienia właściwość przyciągania:

Jest to zrozumiałe, ponieważ widać, że używasz przyciąganie OneWay. Wiązanie jednostronne oznacza, że właściwość aktualizuje interfejs użytkownika, ale nie odwrotnie. Tak więc, zmiana nazwy musi zaktualizować pole tekstowe, ale zmiana pola tekstowego nie aktualizuje imię.

Na tyle ciekawe, że jeśli po prostu opuść Mode = OneWay częściowo to powinno zadziałać - ponieważ pola tekstowe domyślnie należy używać kotwicy TwoWay. Polecam wyraźnie określić powiązania pola tekstowego jak Mode = TwoWay

2. Twój pomysł jest inicjowana pustą ramką / pola tekstowego

Jest to trudniejsze do określenia, ponieważ nie pokazują nam, gdzie zainstalowałeś swój DataContext. Zwykle dzieje się ze mną, kiedy ja ustalam DataContext PO InitializeComponent()zamiast wcześniej. Albo instalujesz DataContext do inicjowania powiązania (jako część InizializeComponent()), albo trzeba zadzwonić NotifyPropertyChanged w swojej właściwości, aby później zaktualizować interfejs użytkownika.

Jeśli przyczyna nie w tym, można włączyć błędy wiązania WPF w konsoli wyjścia - to zwykle daje dobre pojęcie o tym, gdzie twoje skróty nie działają. W Visual Studio istnieje możliwość, aby to zrobić. Powinien on być umieszczony tutaj:

Narzędzia -> Opcje ->> Debug ->>> Okno wyjściowe ->>>> Ustawienia śledzenia WPF -> Wiązanie danych ->> Wszystko

2021-11-22 12:54:14

Przede wszystkim bardzo wam dziękuję za odpowiedź.
rapta asdaf

Dziękuję bardzo! Trzeba było trochę poszukać, ale znalazłem go. "DataContext = nowy EditorViewModel ();" - jest to wiersz, który przegapiłem.
rapta asdaf

To brzmi źle. Jesteś pewien, że nowy egzemplarz EditorViewModel-to jest to, co trzeba? Generalnie podejście jest w użyciu DataContext = this; do InitializeComponent();
Shrimperator

jesteś pewien? nie. Ja trochę czytałem i próbowałem, że zadziałało. Moje rozwiązanie daje pożądany rezultat. Jeśli wyciągnę new EditorViewModel() z this to już nie działa. Nie wiem, импотентно czy to to, ale użyłem Калибурн.Mikro w projekcie. Po prostu więcej informacji na dodałem odpowiednią klasę do wiadomości.
rapta asdaf
0

Zakładam, że chcesz tu pokazać swój drugi rzut oka (EditorVieww pierwszym (a nie jak okienko-jeśli masz zamiar używać go jako wyskakujące okno, należy użyć WindowManager zamiast ActivateItemAsync).

Jedna rzecz, którą trzeba zmienić, aby było to możliwe, to upewnić się, że twoje drugie przedstawienie-to formant niestandardowy, a nie okno.

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

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

Również od korzystania z ActivateItemAsynctrzeba będzie upewnić się, że twój FirstView zawiera ContendControl o nazwie "ActiveItem".

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

Wezwanie do ActivateItemAsync będzie używać ten formant, aby pobrać prezentację swojego drugiego modelu widoku (EditorViewModel). Teraz, kiedy to zrobić, można użyć ActivateItemAsync sposób pobierania prezentacji.

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

Proszę zwrócić uwagę, że ta metoda ActivateItemAsync obsługuje asynchroniczne wywołania, i byłoby rozsądne, aby wywołać metodę asynchronicznie.

Jeszcze jeden moment, na który należy zwrócić uwagę, polega na tym, że nie trzeba wyraźnie wskazywać DataContext, jak pokazano w OP, jeśli używasz Caliburn Micro, a widok/modele widoki są przechowywane w zalecanych strukturach folderów/przestrzeni nazw. Caliburn Micro wykorzystuje umowy o nazwach do wiązania odpowiednich par widok-model prezentacji. Więcej informacji na ten temat można znaleźć w oficjalnej dokumentacji

2021-11-23 06:48:07

W innych językach

Ta strona jest w innych językach

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