Ошибка пути BindingExpression в дочерних элементах управления пользователя - PullRequest
2 голосов
/ 28 июня 2011

Я разрабатываю приложение на основе WPF / PRISM.Родительское представление (usercontrol) содержит много областей, и дочерние представления (usercontrol) загружаются в эти области.Когда дочерние представления загружаются, я вижу ошибки связывания, напечатанные в консоли.Несмотря на то, что связанные свойства являются частью модели представления дочернего представления, разрешение привязки сначала смотрит на модель представления родительского представления и выдает эту ошибку.Приложение работает нормально, я хочу знать, смогу ли я избавиться от этих ошибок.

Мне удалось воссоздать это в простом приложении, которое я написал.

C #

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
        InitializeComponent(); 
        this.DataContext = this; 
        this.Loaded += (o, e) => { this.layout.DataContext = new ViewModel(); }; 
    } 
} 

public class ViewModel 
{ 
    public ViewModel() 
    { 
        this.SampleText = "Sample"; 
    } 

    public string SampleText { get; set; } 
} 

XAML

<Window x:Class="DataBindingResolution.MainWindow" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase" 
        Title="MainWindow" Height="350" Width="525"> 
    <Grid x:Name="layout"> 
        <Grid.Resources> 
            <TextBlock x:Key="test" Text="{Binding SampleText}"/> 
        </Grid.Resources> 
        <Button Content="{StaticResource test}"/> 
    </Grid> 
</Window>

При запуске этого примера вы увидите:

System.Windows.Data Ошибка: 39: Ошибка пути BindingExpression: свойство SampleText ненайдено в 'объекте' '' MainWindow '(Name =' ')'.BindingExpression: Path = SampleText;DataItem = 'MainWindow' (Name = '');целевым элементом является TextBlock (Name = '');Целевым свойством является «Текст» (тип «Строка»)

, выводимый на печать в консоли, даже если кнопка правильно отображает текст «Образец».Как мне избавиться от этого сообщения после печати в консоли, мое приложение печатает более 25 ошибок для каждого загруженного дочернего представления.

Ответы [ 2 ]

3 голосов
/ 28 июня 2011

Вероятно, вам следует разделить две модели ViewModel на два класса.Затем пусть родительская ViewModel ссылается на дочернюю ViewModel.Все остальное может быть достигнуто с помощью привязки.

public partial class MainWindow : Window     
{    
    public MainWindow()         
    {             
        InitializeComponent();             
        this.DataContext = new ParentViewModel();             
    }        
}  

public class ParentViewModel     
{
    public ViewModel()        
    { 
        this.Child = new ChildViewModel();       
    }         

    public ChildViewModel Child { get; set; }     
}  

public class ChildViewModel     
{
    public ViewModel()        
    { 
        this.SampleText = "Sample";         
    }         

    public string SampleText { get; set; }     
}

Этот упрощенный Xaml хотел бы:

<Window>     
 <Grid x:Name="layout" DataContext="{Binding Child}">
    <Button Content="{Binding SampleText}"/>
    </Grid> 
</Window>
0 голосов
/ 28 июня 2011

Вам нужно установить DataContext в обработчике событий Loaded?

Я немного переместил код и запретил вывод сообщений:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new ViewModel();
        //this.Loaded += (o, e) => { this.layout.DataContext = new ViewModel(); };
    }
}

public class ViewModel
{
    public ViewModel()
    {
        this.SampleText = "Sample";
    }
    public string SampleText { get; set; }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...