【问题标题】:WPF binding to a Usercontrol and getting an errorWPF 绑定到用户控件并出现错误
【发布时间】:2014-03-06 06:43:50
【问题描述】:

我从 WPF 开始,抱歉,如果我不能很好地解释,我有几个小时试图解决如何将集合绑定到名为 PagingDataGrid 的自定义网格。

PagingDataGrid 位于 CustomerSearchControl 中,将 GridItems 绑定到 ItemsSource,当我执行 SearchCommand GridItems 得到更新但没有其他变化时。

我收到以下错误:

System.Windows.Data Error: 40 : BindingExpression path error: 'GridItems' property not found on 'object' ''PagingDataGridViewModel' (HashCode=54151655)'. BindingExpression:Path=GridItems; DataItem='PagingDataGridViewModel' (HashCode=54151655); target element is 'PagingDataGrid' (Name='Me'); target property is 'ItemsSource' (type 'IEnumerable')

客户搜索控件:

<UserControl x:Class="Namespace.CustomerSearchControl"
             ... >
    <Control.DataContext>
        <Binding Path="CustomerSearchViewModel" ... />
    </Control.DataContext>
    <DockPanel LastChildFill="True">
        <GroupBox Header="Registros">
            <controls:PagingDataGrid ItemsSource="{Binding GridItems}" Height="300" />
        </GroupBox>
    </DockPanel>
</UserControl>


public class CustomerSearchViewModel : ViewModelBase
{
    public ObservableCollection<GridItem> GridItems{ get; set; }
    public ICommand SearchCommand { get; set; }

    public CustomerSearchViewModel()
    {
        GridItems = new ObservableCollection<GridItem>();
        SearchCommand = new RelayCommand(SearchEntities, () => true);
    }
}

分页数据网格:

<UserControl x:Class="Namespace.PagingDataGrid" x:Name="Me"
             ... >
    <UserControl.DataContext>
        <Binding Path="PagingDataGridViewModel" ... />
    </UserControl.DataContext>
    <Grid>
       ...
        <xcdg:DataGridControl 
            ItemsSource="{Binding ElementName=Me, Path=ItemsSource}" Grid.Row="0"/>
    </Grid>
</UserControl>


public partial class PagingDataGrid : UserControl
{
    public static readonly DependencyProperty ItemsSourceProperty
        = DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(PagingDataGrid),
        new PropertyMetadata(default(IEnumerable)));

    public IEnumerable ItemsSource
    {
        get { return (IEnumerable)GetValue(ItemsSourceProperty); }
        set { SetValue(ItemsSourceProperty, value); }
    }
}

【问题讨论】:

    标签: c# wpf data-binding binding


    【解决方案1】:

    您需要在 XAML 中声明 CustomerSearchViewModel 的实例并绑定到 DataContext。

    这是怎么做的:

    <UserControl.DataContext>
       <local:CustomerSearchViewModel/>
    </UserControl.DataContext>
    

    确保在根目录下声明命名空间local,即在用户控件:

    xmlns:local="clr-namespace:WpfApplication" <-- Replace WpfApplication with
                                                 actual namespace of your ViewModel.
    

    从 ServiceLocator 获取实例后不需要。


    要绑定到GridItems,您需要使用RelativeSource 显式绑定到CustomerSearchControl DataContext。这是必需的,因为您已将 PagingDataGrid 上的 DataContext 显式设置为 PagingDataGridViewModel。因此,它将在 PagingDataGridViewModel 中搜索 GridItems 属性,而不是在 CustomerSearchViewModel 中搜索。

    <controls:PagingDataGrid ItemsSource="{Binding DataContext.GridItems, 
               RelativeSource={RelativeSource Mode=FindAncestor, 
                                   AncestorType=UserControl}}"/>
    

    或者您可以将x:Name 分配给CustomerSearchControl 并使用ElementName 进行绑定。

    【讨论】:

    • 我有一个定位器提供的实例:
    • @Najera - 很好。然后你必须做我刚刚更新的第二件事才能让它工作。
    • 我遇到了几乎相同的错误:System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“PagingDataGridViewModel”(HashCode=54151655)上找不到“GridItems”属性。 BindingExpression:Path=DataContext.GridItems; DataItem='PagingDataGrid'(名称='我');目标元素是'DataGridControl'(名称='');目标属性是“ItemsSource”(类型“IEnumerable”)
    【解决方案2】:

    永远不要将用户控件的数据上下文设置为 self。 所以只需删除

     <UserControl.DataContext>
        <Binding Path="PagingDataGridViewModel" ... />
     </UserControl.DataContext>
    

    编辑: 如果你不删除它,那么你的

    <UserControl x:Class="Namespace.PagingDataGrid" x:Name="Me">
      <UserControl.DataContext>
        <Binding Path="PagingDataGridViewModel" ... />
      </UserControl.DataContext>
      <Grid>
        <xcdg:DataGridControl ItemsSource="{Binding ElementName=Me, Path=ItemsSource}" Grid.Row="0"/>
    </Grid>
    </UserControl>
    

    您的用户控件的数据上下文是 PagingDataGridViewModel,如果 PagingDataGridViewModel 没有属性 ItemsSource,您会收到错误消息。您永远不会从您想要的 CustomerSearchViewModel 中获得 GridItems。

    【讨论】:

    • 感谢您的回答,但我使用的是 MVVM Light Toolkit 中的定位器。
    猜你喜欢
    • 2012-06-15
    • 2015-05-21
    • 1970-01-01
    • 2013-06-06
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    相关资源
    最近更新 更多