2015-01-08 24 views
0

我有一個名爲AntecedentControl用戶控件:WPF:從用戶控制結合性視圖模型

的XAML:

<UserControl x:Name="AntecedentUserControl"> 

<ScrollViewer DataContext="{Binding ElementName=AntecedentUserControl}"> 
    <telerik:RadGridView ItemsSource="{Binding Path=AntecedentList}" 
         AutoGenerateColumns="False" 

     <telerik:RadGridView.Columns> 
      <telerik:GridViewDataColumn DataMemberBinding="{Binding Section, Mode=TwoWay}" 
             Header="Seccion" 
             IsVisible="True" 
             IsFilterable="False"/> 
      <telerik:GridViewDataColumn DataMemberBinding="{Binding Group, Mode=TwoWay}" 
            Header="Grupo" 
            IsVisible="True" 
            IsFilterable="False"/> 
      <telerik:GridViewDataColumn DataMemberBinding="{Binding Tome, Mode=TwoWay}" 
            Header="Tomo" 
            IsVisible="True" 
            IsFilterable="False"/> 
      <telerik:GridViewDataColumn DataMemberBinding="{Binding Volume, Mode=TwoWay}" 
            Header="Volumen" 
            IsVisible="True" 
            IsFilterable="False"/> 
      <telerik:GridViewDataColumn DataMemberBinding="{Binding Inscription, Mode=TwoWay}" 
            Header="Inscripcion" 
            IsVisible="True" 
            IsFilterable="False"/> 
      <telerik:GridViewDataColumn DataMemberBinding="{Binding Bis, Mode=TwoWay}" 
            Header="Bis" 
            IsVisible="True" 
            IsFilterable="False"/> 
      <telerik:GridViewColumn> 
       <telerik:GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <telerik:RadButton Content="Delete" 
              Command="telerikGrid:RadGridViewCommands.Delete" 
              CommandParameter="{Binding}"/> 
        </DataTemplate> 
       </telerik:GridViewColumn.CellTemplate> 
      </telerik:GridViewColumn> 
     </telerik:RadGridView.Columns> 

    </telerik:RadGridView> 
</ScrollViewer> 

代碼隱藏(C#):

public partial class AntecedentControl : UserControl 
{ 
    public ObservableCollection<Antecedent> AntecedentList 
    { 
     get { return (ObservableCollection<Antecedent>)GetValue(AntecedentListProperty); } 
     set { SetValue(AntecedentListProperty, value); } 
    } 

    public static readonly DependencyProperty AntecedentListProperty = 
     DependencyProperty.Register("AntecedentList", 
     typeof(ObservableCollection<Antecedent>), 
     typeof(AntecedentControl), 
     new FrameworkPropertyMetadata(new ObservableCollection<Antecedent>(), OnListPropertyChanged)); 

    private static void OnListPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) 
    { 
     var antecedentList = source as AntecedentControl; 
     var value = e.NewValue as ObservableCollection<Antecedent>; 
     antecedentList.AntecedentList = value; 
    } 

    public AntecedentControl() 
    { 
     InitializeComponent(); 
    } 
} 

而且,在一個單獨的視圖中,我打電話給這個UserControl,像這樣:

<DomainTransmissionControls:AntecedentControl AntecedentList="{Binding ElementName=AntecedentUserControl, Path=Antecedents, Mode=TwoWay}"/> 

在這個單獨的視圖的視圖模型,我已經叫物業「前因」:

public ObservableCollection<Antecedent> Antecedents { get; set; } 

在簡單的話:AntecedentControl UC是有一個方法,你可以添加/編輯網格所述網格上的項目。當前UC的屬性「AntecedentList」是列表正被「保存」的地方。

其中'AntecedentControl'被調用的其他UC的ViewModel的屬性'Antecedents'應該綁定到AntecedentControl UC的'AntecedentList'。

我想知道如何將ViewModel上的這個屬性綁定到在單獨UserControl(AntecedentControl)中找到的屬性'AntecedentList'屬性,因爲這個當前代碼返回null。

我相信AntecedentControl UC上的DependencyProperty聲明有問題,因爲在'OnListPropertyChanged'方法上放置斷點顯示e.NewValue返回null。

如果是這樣,爲什麼不返回在依賴屬性語句中聲明的默認值?

謝謝你的時間。

+0

只是注意:你的'OnListPropertyChanged'是多餘的,因爲它僅設置屬性的值一次。當屬性值已更改時,會調用依賴項屬性更改回調。您不必再次設置該值。 – Clemens

+0

另外,您不應該使用集合實例作爲您的依賴項屬性的默認值。請參閱[這裏](http://msdn.microsoft.com/en-us/library/aa970563.aspx#initializing)以獲取解釋。 – Clemens

+0

@Clemens感謝您的評論,但關於默認值,這不應該是一個只讀依賴屬性,所以在您發佈的文章中設置它就會破壞我的代碼,因爲我需要UC能夠添加/編輯其他UC內的物品。 – Xanagandr

回答

1

您的綁定似乎不正確。您似乎試圖訪問您創建的UserControl內部的元素(AntecedentUserControl)?

除非您爲簡單起見而遺漏了一些代碼,否則實際上您甚至不需要DependencyProperty?有什麼理由不能設置DataContext?

SomeView.xaml

<DomainTransmissionControls:AntecedentControl DataContext="{Binding Antecedents}" /> 

SomeViewModel.cs

private ObservableCollection<Antecedent> _antecedents; 

public ObservableCollection<Antecedent> Antecedents 
{ 
    get 
    { 
     if (_antecedents == null) 
      _antecedents = new ObservableCollection<Antecedent>(); 

     return _antecedents; 
    } 
} 

AntecedentControl.xaml

<UserControl> 
    <ScrollViewer> 
     <telerik:RadGridView ItemsSource="{Binding}" AutoGenerateColumns="False"> 
      <telerik:RadGridView.Columns> 
       <telerik:GridViewDataColumn DataMemberBinding="{Binding Section, Mode=TwoWay}" 
              Header="Seccion" IsFilterable="False" IsVisible="True" /> 
       <!-- Additional column definitions. --> 
      </telerik:RadGridView.Columns> 
     </telerik:RadGridView> 
    </ScrollViewer> 
</UserControl> 

AntecedentControl.xaml.cs

public partial class AntecedentControl : UserControl 
{ 
    public AntecedentControl() 
    { 
     InitializeComponent(); 
    } 
} 
+0

我也認爲這可以像普通綁定一樣解決,但每次我設置斷點來驗證它時,它都會使我空。我試過你的解決方案,但無濟於事。不過,感謝您的幫助。 – Xanagandr

+0

@Xanagandr你確定你需要一個DependencyProperty?爲了簡潔起見,您是否遺漏了代碼?看看我的新建議。 –

+0

是的,如果我嘗試使用正常的屬性設置,將屬性綁定在一起時,我得到一個異常,指出只能將屬性綁定到依賴屬性。我也試過你的例子,但它仍然沒有從AntecedentControl屬性返回值。 – Xanagandr