WPF Databinding na druhý pohled

0

Otázka

Mám strávit trochu více než Den, na tento problém a jsem naprosto Bezradný. Když jsem klepněte na tlačítko ukázat Druhý Pohled se Otevře, ale bez Obsahu. Dokonce jsem si o zlomu v Pohledu Modelu. Na to jsem snížil vše na Jednoduché Textové pole a Textblock, který zavřel zobrazit stejná Data, ale oni ne. Oni ukázat nic ani po zadání do Pole Bloku neaktualizuje. Ale co se vůbec snažím vázání dat nefunguje. Má někdo nějaký Nápad?

Díky Předem

Můj druhý Pohled

<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);
        }
    }
}

Jak říkám oba

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

přidány Informace

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

Nejlepší odpověď

0

Máte dva samostatné problémy:

1. Psaní do textového pole nemění vázán nemovitosti:

To je očekávané, protože používáte OneWay vazba výslovně. OneWay vazba znamená, že majetek aktualizuje uživatelské rozhraní, ale ne naopak. Takže změna FirstName měli aktualizovat Textové pole, ale změna textového pole neaktualizuje Jméno.

Je zajímavé, že pokud jste jen vynechat Mode = OneWay část, mělo by to fungovat - od textových Polí by měly používat Dvoucestné vázání ve výchozím nastavení. Doporučuji vám definovat vaše TextBox výslovně jako závazné Mode = TwoWay

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

Tenhle je těžší, aby pin dolů, protože nechceš nám ukázat, kde můžete nastavit své DataContext. To obvykle se stane se mnou, když jsem se nastavit DataContext PO InitializeComponent()namísto před ním. Můžete buď nastavit DataContext před závazné je inicializován (jako součást InizializeComponent()), nebo budete muset zvýšit NotifyPropertyChanged na vaší nemovitosti k aktualizaci UI později.

Pokud to není příčinou, možná budete chtít, aby WPF binding chyby ve výstupní konzole, která se obvykle dává dobrou představu o tom, kde se vaše vazby selžou. Visual Studio má možnost za to. To by měl být umístěn zde:

Nástroje -> Možnosti -> Ladění -> Výstupní Okno -> WPF Nastavení Trasování -> Data Binding -> Všechny

2021-11-22 12:54:14

Za prvé, děkuji moc za vaši Odpověď.
rapta asdaf

Díky moc! Potřeboval jsem trochu hledat, ale našel jsem to. "DataContext = new EditorViewModel();" je na lince jsem byl chybí.
rapta asdaf

Ne, to nezní dobře. Jsi si jistý, že nové instance EditorViewModel je to, co chcete? Obvykle, tento přístup je použít DataContext = this; před InitializeComponent();
Shrimperator

jistá? ne. Jsem trochu číst a zkoušel, co fungovalo. Moje řešení produkuje požadovaný výsledek. Pokud jsem nahradit new EditorViewModel() s this to už nefunguje. Já nevím, jestli je impotentní, ale kdysi jsem Caliburn.Mikro v Projektu. Jen pro další informace jsem přidal dané Třídy do sloupku.
rapta asdaf
0

Věřím, že to, co se snažíte tady je show vaše druhé View (EditorView) v rámci první (a ne jako pop-up - pokud máte v úmyslu mít ji jako popup, použijte WindowManager místo ActivateItemAsync).

Jedna věc, kterou je třeba změnit pro výrobu to možné je zajistit, aby váš druhý Pohled je UserControl a ne Okno.

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

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

Také od vaší pomocí ActivateItemAsyncbudete muset zajistit, že vaše FirstView obsahuje ContendControl s Názvem "ActiveItem".

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

Volání ActivateItemAsync by použít tento ovládací prvek, aby zatížení, Názor druhého ViewModel (EditorViewModel). S tímto na místě, můžete nyní používat ActivateItemAsync metoda pro načtení Zobrazení.

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

Vezměte prosím na vědomí, že způsob, ActivateItemAsync podporuje asynchronní volání, a to by bylo moudré, aby volání metody asynchronně.

Další bod k poznámce je, že není třeba zadat DataContext výslovně, jak je vidět na OP, pokud používáte Caliburn Micro a Zobrazit/ViewModels jsou uloženy v doporučených složky/jmenné prostory staveb. Caliburn Micro používá konvence spojit příslušné view-viewmodel párů. Více informací na stejné lze nalézt v oficiální dokumentaci

2021-11-23 06:48:07

V jiných jazycích

Tato stránka je v jiných jazycích

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