WPF Databinding la a doua vedere

0

Problema

Am petrecut un pic mai mult de o Zi pe această problemă și sunt absolut nicio idee. Dacă faceți clic pe butonul pentru a afișa cea de-a Doua Vedere se Deschide, dar fără Conținut. Am obține chiar și cu un punct de întrerupere în Vedere Modelul. Pentru aceasta, am redus totul la o Simpla Caseta de text și Textblock care afișează aceleași Date, dar ei nu fac. Ele arată nimic chiar și după Tastarea în Caseta de Bloc nu se actualizează. Dar ceea ce am încerca Databinding nu Funcționează. Are cineva o Idee?

Multumesc anticipat

Al doilea meu de Vedere

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

Cum îmi sună atât de ei

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

adăugat Informații

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

Cel mai bun răspuns

0

Aveți două aspecte distincte:

1. Tastarea în caseta de text nu se schimba legate de proprietate:

Acest lucru este de așteptat, din moment ce utilizarea sensuri unice obligatorii în mod explicit. Sensuri unice obligatorii reprezintă proprietatea actualizări interfața cu utilizatorul, dar nu invers. Deci schimbarea FirstName ar trebui să actualizeze la Caseta, dar schimbarea Caseta nu se actualizează FirstName.

Destul de interesant, dacă ai omite Mode = OneWay parte, acesta ar trebui să funcționeze - de Casete trebui să utilizați Bidirecțională cu caracter obligatoriu în mod implicit. Vă recomandăm să vă definiți Casuta cu caracter obligatoriu în mod explicit ca Mode = TwoWay

2. Punctul dumneavoastră de vedere initializeaza cu un gol TextBlock / Casuta

Acesta este mai greu de stabilit, din moment ce nu ne arătați unde ați stabilit DataContext. De obicei acest lucru se întâmplă cu mine atunci când am stabilit DataContext DUPĂ InitializeComponent(), în loc de înainte. Fie setați DataContext înainte de legarea este inițializat (ca parte a InizializeComponent()), sau va trebui să ridice un NotifyPropertyChanged pe proprietatea ta pentru a actualiza UI după aceea.

Dacă acest lucru nu este cauza, s-ar putea să doriți să activați WPF obligatorii erori în consola de ieșire - care de obicei vă oferă o idee bună în cazul în care legăturile nu reușesc. Visual Studio are o opțiune pentru asta. Ar trebui să fie amplasat aici:

Instrumente -> Opțiuni -> Depanare -> Fereastra de Ieșire -> WPF Setări de urmărire -> Datele Obligatorii -> Toate

2021-11-22 12:54:14

Mai întâi de toate, vă mulțumesc foarte mult pentru Răspunsul dumneavoastră.
rapta asdaf

Multumesc mult!!! Am nevoie pentru a căuta un pic, dar am găsit-o. "DataContext = new EditorViewModel();" este linia pe care am fost lipsă.
rapta asdaf

Asta nu suna bine. Ești sigur o nouă instanță a EditorViewModel este ceea ce vrei? De obicei, abordarea este de a folosi DataContext = this; înainte de a InitializeComponent();
Shrimperator

sigur? nr. Am citit un pic si am incercat ceea ce a lucrat. Soluția mea a produce rezultatul dorit. Dacă am înlocui new EditorViewModel() cu this acesta nu mai funcționează. Nu știu dacă este impotent dar am folosit Caliburn.Micro în Proiect. Pentru informații suplimentare, am adăugat Clasa în cauză în post.
rapta asdaf
0

Cred că ceea ce sunteți încercarea de aici este de a arăta de-al doilea punct de Vedere (EditorView) în primul rând (și nu ca un pop-up - dacă intenționați să-l aibă ca popup, utilizați WindowManager în loc de ActivateItemAsync).

Un singur lucru trebuie să se schimbe pentru a face posibil acest lucru este de a asigura al doilea punct de Vedere este un UserControl și nu o Fereastră.

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

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

De asemenea, deoarece folosind ActivateItemAsync, ar trebui să se asigure că FirstView conține o ContendControl cu Numele "ActiveItem".

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

Apelul la ActivateItemAsync as folosi acest control pentru a încărca Vedere de-a doua ViewModel (EditorViewModel). Cu aceasta în loc, ai putea folosi acum ActivateItemAsync metoda pentru a încărca Vedere.

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

Vă rugăm să rețineți că metoda de ActivateItemAsync acceptă apeluri asincrone și ar fi înțelept pentru a apela metoda asincron.

Un alt punct de remarcat este faptul că nu aveți nevoie pentru a specifica DataContext în mod explicit cum se vede în OP dacă utilizați Caliburn Micro și punctul de Vedere/ViewModels sunt stocate în a recomandat dosar/nume structuri. Caliburn Micro utilizează convențiile de denumire a asocia corespunzătoare view-viewmodel perechi. Mai multe informații pe același putea fi găsite în documentația oficială

2021-11-23 06:48:07

În alte limbi

Această pagină este în alte limbi

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