WPF Databinding สองมุมมอง

0

คำถาม

ฉันต้องใช้เวลาเล็กน้อยมาวันนี้เป็นวันที่ปัญหานี้และฉันแน่นอเงื่อนงำน้อยมาก ถ้าฉันอคลิกที่ปุ่มนี้เพื่อให้มีการแสดงที่สองมุมมองมันจะเปิดแต่โดยไม่ต้องเนื้อหาได้ที่นี่ ฉันให้โดยมีจุดหยุดในมุมมอนคุณครูแต่พอกลับมา เรื่องนี้ฉันต้องลดทุกอย่างจะเรียบง่าย Textbox และ Textblock นที่ปิดการแสดงเดียวกับข้อมูลแต่พวกเขาไม่สามารถทำได้ พวกเขาไม่มีอะไรแสดงถึงแม้หลังจากพิมพ์เข้าไปในกล่องที่บล็อคไม่ได้รับข่าวคืบหน้า แต่สิ่งที่ฉันเคยพยายามที่ Databinding ไม่ทำงาน มีใครมีไอเดีย?

ขอบคุณล่วงหน้า

ครั้งที่สองมุมมอง

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

ฉัน ViewModel

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

    public string FirstName
    {
        get
        {

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

ยังไงผมเรียกทั้งสองของพวกเขา

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

เพิ่มข้อมูล

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

คำตอบที่ดีที่สุด

0

คุณสองคนแยกออกปัญหาเรื่อง:

1. พิมพ์เข้าไปใน textbox ไม่ได้เปลี่ยนแปลงที่ผูกทรัพย์สิน:

นี่คือคาดหวังตั้งแต่คุณใช้ OneWay ถูกเชื่อมโยงในข้อบังคับ. OneWay อผูหมายความว่าทรัพย์สินปรับปรุงส่วนติดต่อกับผู้ใช้แต่ไม่ใช่ตรงกันข้ามกันเลยนะ ดังนั้นการเปลี่ยน FirstName ควรจะปรับปรุงที่ TextBox แต่การเปลี่ยน TextBox ไม่ได้ปรับปรุง FirstName.

น่าสนใจมากพอถ้าคุณจะไม่ลงรายละเอียง Mode = OneWay ส่วนหนึ่ง,มันควรจะทำงานตั้งแต่ TextBoxes ควรจะใช้ TwoWay ถูกเชื่อมโยงโดยปริยาย ฉันขอแนะนำให้คุณกำหนดของคุณ TextBox ถูกเชื่อมโยงในข้อบังคับเหมื Mode = TwoWay

2. ของมุมมอง initializes กับว่า TextBlock/TextBox

นี่ยากที่จะปักหมุดลงตั้งแต่คุณไม่แสดงให้เราเห็นอยู่ไหนคุณตั้งค่าของคุณ DataContext. นี่ปกติเกิดขึ้นกับชีวิตของผมตอนที่ผมจะตั้งหลังจาก DataContext InitializeComponent()แทนที่จะเป็นมาก่อน คุณเหมือนกันตั้ง DataContext ก่อนที่จะถูกเชื่อมโยงเป็นสามารถใช้ถอ(เป็นส่วนนึงของ InizializeComponent()),หรือคุณต้องเลี้ยงเป็น NotifyPropertyChanged บทรัพย์สินของคุณต้องปรับปรุงส่วนติดต่อผู้ใช้หลังจากสิ่งที่เกิดขึ้น

ถ้านี่ไม่ใช่เพราะคุณอาจจะต้องการจะเปิดใช้งาน WPF อผูกมีข้อผิดพลาดอยู่ภายในของคุณแสดงผลคอนโซล-นั่นจะทำให้คุณเป็นความคิดที่ดีของที่ของคุณ bindings ล้มเหลว มองเห็นสตูดิโอเป็นตัวเลือกสำหรับเรื่องนั้น มันควรจะเป็นยังตำแหน่งที่นี่:

เครื่องมือ->ตัวเลือก->ดีบั๊กโปรแกรม->ส่งออกหน้าต่าง->WPF ร่องรอยการตั้งค่า ->ข้อมูลเชื่อม->ทั้

2021-11-22 12:54:14

อย่างแรก,ขอบคุณมากสำหรับคำตอบของคุณ
rapta asdaf

ขอบคุณมาก! ฉันต้องการค้นหานิดหน่อยแต่ผมเจอมัน "DataContext=ใหม่ EditorViewModel();"คือสายฉันหายตัวไป
rapta asdaf

นั่นฟังดูไม่ถูกต้องนะ คุณแน่ใจหรือใหม่กตัวอย่างของ EditorViewModel คือสิ่งที่คุณต้องการ? ปกติแล้ว,เข้าไปหาคือที่จะใช้ DataContext = this; ก่อน InitializeComponent();
Shrimperator

แน่ใจเหรอ? ไม่นะ ผมอ่านนิดหน่อยและพยายามที่ทำงานอยู่ วิธีแก้ปัญหาของฉันได้ที่ต้องการผลลัพธ์. ถ้าผมแทน new EditorViewModel() กับ this มันไม่ทำงานอีกต่อไปแล้ว ฉันไม่รู้ถ้ามันเป็นไร้สมรรถภาพทางเพแต่ฉันเคย Caliburn.โครกในโครงการนี้ไป แค่สำหรับข้อมูลฉันเพิ่มชั้นเรียนอยู่ในคำถามเข้าไปในตำแหน่งนี้
rapta asdaf
0

ผมเชื่อว่าสิ่งที่คุณพยายามอยู่นี่คือการแสดงของคุณสองมุมมอง(EditorView)ในครั้งแรก(และไม่เป็นที่ป๊อป-ขึ้นถ้าคุณตั้งใจให้มันเป็นแบบแสดงเป็นเมนูให้เลือกใช้ WindowManager แทนที่จะเป็น ActivateItemAsync).

สิ่งหนึ่งที่คุณต้องเปลี่ยนแปลงที่ทำให้มันเกิดขึ้นได้คือต้องให้แน่ใจว่าคุณสองมุมมองเป็น UserControl และไม่ใช่หน้าต่าง

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

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

ก็ตั้งแต่คุณใช้ ActivateItemAsyncคุณจะต้องการเพื่อให้แน่ใจว่านั่นของคุณ FirstView นมีส่วน ContendControl กับชื่อ"ActiveItem".

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

รอยโทรศัพท์ ActivateItemAsync คงใช้ตัวควบคุมนี้เพื่อทำการโหลดในมุมมองของคุณสอง ViewModel(EditorViewModel). กับเรื่องนี้อยู่ในสถานที่คุณสามารถตอนนี้ใช้ ActivateItemAsync วิธีการที่จะโหลดมุมมอง

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

โปรดจำไว้ว่าวิธีการ ActivateItemAsync สนับสนุน asynchronous เรียนและมันจะต้องฉลาดที่จะโทรหาวิธีการ asynchronously.

คนหนึ่งต้องโน้ตคืนนั้นคุณไม่ต้องการสำหรับกำหนด DataContext ในข้อบังคับที่เห็นในปฏิบัติการถ้าคุณกำลังใช้ Caliburn โครและแสดง/ViewModels จะถูกจัดเก็บไว้ในห้อแนะนำให้ใช้โฟลเดอร์/แทนที่นั่นซิ Caliburn โครใช้การตั้งชื่อ conventions ที่จะเชื่อมโยงที่เหมาะสมมุมมอง-viewmodel คู่ มากกข้อมูลเดียวกันอาจจะเป็นพบใน ย่างเป็นทางการเอกสารคู่มือ@info:shell

2021-11-23 06:48:07

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่