WPF Databinding na druhý pohľad

0

Otázka

Mám stráviť trochu viac Dňa na tento problém a som úplne Bezradný. Keď som kliknite na tlačidlo, ak chcete zobraziť Druhý Pohľad to Otvorí, ale bez Obsahu. Dokonca som si breakpoint v Okne Model. Pre toto som znížená všetko Jednoduché textové pole a Textblock, ktoré vypnúť displej rovnaké Údaje, ale oni nie. Zobrazujú sa v nich nič, ani po Zadaním do Poľa Bloku neaktualizuje. Ale to, čo niekedy som skúste Databinding nefunguje. Má niekto Nápad?

Vďaka Vopred

Môj druhý Pohľad

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

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

    public string FirstName
    {
        get
        {

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

Ako hovorím, ako z nich

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

pridané Informácie

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

Najlepšiu odpoveď

0

Máte dve samostatné otázky:

1. Písanie do textbox nič nemení viazaný vlastnosť:

To je očakávané, pretože môžete použiť OneWay záväzné explicitne. OneWay záväzné znamená majetku aktualizácie používateľské rozhranie, ale nie naopak. Takže zmena FirstName by sa mal aktualizovať TextBox, ale zmena TextBox nebude aktualizovať Meno.

Je dosť zaujímavé, ak ste vynechávajú Mode = OneWay časť, by to malo fungovať, pretože TextBoxes by mali používať TwoWay záväzné v predvolenom nastavení. Odporúčam vám definovať svoje TextBox výslovne ako záväzné Mode = TwoWay

2. Váš názor inicializuje s prázdnym TextBlock / TextBox

Toto je ťažšie pozorovateľný, pretože nie je nám ukázal, kde si môžete nastaviť svoj DataContext. To sa zvyčajne stane sa mi, keď som nastaviť DataContext PO InitializeComponent()namiesto toho , aby predtým. Môžete buď nastaviť DataContext pred jej záväzným je inicializovaný (ako súčasť InizializeComponent()), alebo budete musieť zvýšiť NotifyPropertyChanged na svoj majetok, aby sa aktualizovať UI neskôr.

Ak to nie je príčina, možno budete chcieť povoliť WPF záväzné chyby vo vašom výstup konzoly -, ktoré sa obvykle dáva dobrú predstavu o tom, kde sa vaše väzby zlyhať. Visual Studio má možnosť za to. To by malo byť umiestnené tu:

Nástroje -> Možnosti -> Ladenie -> Výstup Okno -> WPF Stopových Nastavenia -> Záväzné Údaje -> Všetko

2021-11-22 12:54:14

V prvom rade, ďakujem vám veľmi pekne za vašu Odpoveď.
rapta asdaf

Ďakujeme! Potreboval som hľadať niečo, ale ja som ho našiel. "DataContext = new EditorViewModel();" je čiara mi chýbala.
rapta asdaf

Že neznie právo. Ste si istý, že novú inštanciu EditorViewModel je to, čo chcete? Zvyčajne, prístup je na použitie DataContext = this; pred InitializeComponent();
Shrimperator

či? č. Čítal som trochu snažil, čo fungovalo. Moje riešenie vytvára požadovaný výsledok. Ak som sa vymeniť new EditorViewModel() s this to už nefunguje. Ja neviem, či to je bezmocné, ale použil som Caliburn.Mikro do Projektu. Len pre dodatočné informácie, ktoré som pridal v Triede otázku, do príspevku.
rapta asdaf
0

Verím, že to, čo sa pokúšate tu je ukázať svoj druhý Pohľad (EditorView) v prvý (a nie ako pop-up - ak máte v úmysle mať to ako popup, použitie WindowManager namiesto ActivateItemAsync).

Jedna vec, ktorú treba meniť, takže to možné je, aby vaše druhý Pohľad je UserControl a nie Okna.

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

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

Tiež od vašej pomocou ActivateItemAsync, budete musieť zabezpečiť, aby vaše FirstView obsahuje ContendControl s Názvom "ActiveItem".

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

Volanie ActivateItemAsync by pomocou tejto kontroly na záťaž Zobrazenie vašej druhej ViewModel (EditorViewModel). S týmto na miesto, môžete teraz používať ActivateItemAsync spôsob zaťaženie Názor.

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

Vezmite prosím na vedomie, že spôsob ActivateItemAsync podporuje asynchrónne volania a bolo by múdre zavolať metódu asynchrónne.

Ďalší bod na vedomie, že nie je potrebné zadať DataContext výslovne ako vidieť, v OP, ak používate Caliburn Mikro a View/ViewModels sú uložené v odporúča priečinok/namespaces štruktúr. Caliburn Micro používa konvencií priradiť príslušné zobrazenie-viewmodel páry. Viac informácií o isté možno nájsť v úradnom dokumentácia

2021-11-23 06:48:07

V iných jazykoch

Táto stránka je v iných jazykoch

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