子用户控件中存在BindingExpression路径错误

本文关键字:BindingExpression 路径 错误 存在 用户 控件 | 更新日期: 2023-09-27 18:00:32

我正在开发一个基于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"属性"object"MainWindow"(名称=")"。BindingExpression:Path=SampleText;DataItem='MainWindow'(名称='');目标元素为"TextBlock"(名称=");目标属性为"Text"(类型"字符串")

即使按钮在控制台中正确显示文本"Sample",也会在控制台中打印。如何从控制台中打印此消息,我的应用程序为加载的每个子视图打印25个以上的错误。

子用户控件中存在BindingExpression路径错误

您可能应该将这两个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>

是否需要在Loaded事件处理程序中设置DataContext?

我将代码移动了一点,并阻止了以下消息:

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; }
} 
相关文章:
  • 没有找到相关文章