Привязка данных WPF ко второму представлению

0

Вопрос

Я потратил на эту проблему чуть больше дня и абсолютно ничего не понимаю. Если я нажму кнопку, чтобы показать второй вид, он откроется, но без содержимого. Я даже прохожу точку останова в модели представления. Для этого я свел все к простому текстовому полю и текстовому блоку, которые отображают одни и те же данные, но они этого не делают. Они ничего не показывают, даже после ввода в поле Блок не обновляется. Но что бы я ни пробовал, привязка данных не работает. У кого-нибудь есть идея?

заранее спасибо

Мой второй Взгляд

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

Моя модель просмотра

    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. Ввод в текстовое поле не изменяет свойство привязки:

Это ожидаемо, так как вы явно используете привязку OneWay. Односторонняя привязка означает, что свойство обновляет пользовательский интерфейс, но не наоборот. Таким образом, изменение имени должно обновить текстовое поле, но изменение текстового поля не обновляет имя.

Достаточно интересно, что если вы просто опустите Mode = OneWay отчасти это должно сработать - поскольку текстовые поля по умолчанию должны использовать привязку TwoWay. Я рекомендую вам явно определить привязку текстового поля как Mode = TwoWay

2. Ваше представление инициализируется пустым текстовым блоком / текстовым полем

Это труднее определить, так как вы не показываете нам, где вы установили свой DataContext. Обычно это происходит со мной, когда я устанавливаю DataContext ПОСЛЕ InitializeComponent(), вместо того, чтобы раньше. Вы либо устанавливаете DataContext до инициализации привязки (как часть InizializeComponent()), либо вам нужно вызвать NotifyPropertyChanged в своем свойстве, чтобы впоследствии обновить пользовательский интерфейс.

Если причина не в этом, вы можете включить ошибки привязки WPF в консоли вывода - это обычно дает вам хорошее представление о том, где ваши привязки не работают. В Visual Studio есть возможность для этого. Он должен быть расположен здесь:

Инструменты -> Параметры ->> Отладка ->>> Окно вывода ->>>> Настройки трассировки WPF -> Привязка данных ->> Все

2021-11-22 12:54:14

Прежде всего, большое вам спасибо за ваш ответ.
rapta asdaf

Большое спасибо! Мне нужно было немного поискать, но я нашел его. "DataContext = новый EditorViewModel ();" - это строка, которую я пропустил.
rapta asdaf

Это звучит неправильно. Вы уверены, что новый экземпляр EditorViewModel-это то, что вам нужно? Как правило, подход заключается в использовании DataContext = this; до InitializeComponent();
Shrimperator

уверен? нет. Я немного почитал и попробовал, что сработало. Мое решение дает желаемый результат. Если я заменю new EditorViewModel() с this это больше не работает. Я не знаю, импотентно ли это, но я использовал Калибурн.Микро в проекте. Просто для дополнительной информации я добавил соответствующий класс в сообщение.
rapta asdaf
0

Я полагаю, что вы пытаетесь здесь показать свой второй взгляд (EditorView) в первом (а не как всплывающее окно-если вы собираетесь использовать его как всплывающее окно, используйте WindowManager вместо ActivateItemAsync).

Одна вещь, которую вам нужно изменить, чтобы сделать это возможным, - это убедиться, что ваше второе представление-это пользовательский элемент управления, а не окно.

// 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 будет использовать этот элемент управления для загрузки представления вашей второй модели представления (EditorViewModel). Теперь, когда это сделано, вы можете использовать ActivateItemAsync способ загрузки представления.

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

Пожалуйста, обратите внимание, что этот метод ActivateItemAsync поддерживает асинхронные вызовы, и было бы разумно вызывать метод асинхронно.

Еще один момент, который следует отметить, заключается в том, что вам не нужно явно указывать DataContext, как показано в OP, если вы используете Caliburn Micro, а представление/модели представлений хранятся в рекомендуемых структурах папок/пространств имен. Caliburn Micro использует соглашения об именах для связывания соответствующих пар вид-модель представления. Более подробную информацию об этом можно найти в официальной документации

2021-11-23 06:48:07

На других языках

Эта страница на других языках

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