2014-03-06 28 views
0

我開始使用WPF,抱歉,如果我無法解釋,並且我有幾個小時試圖解決如何將一個集合綁定到一個自定義網格名爲PagingDataGrid。WPF綁定到一個UserControl並出現錯誤

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

CustomerSearchControl:

<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); 
    } 
} 

PagingDataGrid:

<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); } 
    } 
} 

回答

1

您需要在XAML申報CustomerSearchViewModel實例,並綁定到DataContext的。

這是如何做到這一點:

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

確保在用戶控件的根,即申報命名空間local

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

沒有必要的,因爲從服務定位越來越實例。


並結合GridItems需要使用RelativeSource明確地結合到CustomerSearchControl的DataContext。這是必需的,因爲您已將PagingDataGrid上的DataContext明確設置爲PagingDataGridViewModel。因此,它將在PagingDataGridViewModel而不是CustomerSearchViewModel中搜索GridItems屬性。

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

或者你可以給x:NameCustomerSearchControl和使用ElementName綁定。

+0

我有一個定位器提供的實例: Najera

+0

@Najera - 好吧。然後,你必須做第二件事,我剛剛更新答案讓它工作。 –

+0

我得到幾乎相同的錯誤:System.Windows.Data錯誤:40:BindingExpression路徑錯誤:'對象'''PagingDataGridViewModel'(HashCode = 54151655)'找不到'GridItems'屬性。 BindingExpression:路徑=的DataContext。GridItems; DataItem ='PagingDataGrid'(Name ='我');目標元素是'DataGridControl'(Name ='');目標屬性是'ItemsSource'(鍵入'IEnumerable') – Najera

1

從未將usercontrol的datacontext設置爲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> 

的datacontext爲您用戶控件PagingDataGridViewModel如果PagingDataGridViewModel沒有一個屬性的ItemsSource你得到一個錯誤。你永遠不會從你想要的CustomerSearchViewModel中獲得GridItems。

+0

感謝您的答案,但我使用MVVM Light Toolkit中的Locator。 – Najera