2016-11-28 67 views
-1

在我的用戶控件中,我有一個不是數據綁定的依賴項屬性。我查看了幾個堆棧溢出帖子,我無法弄清楚我做錯了什麼。 Property改變的方法從不被調用。我的代碼到目前爲止:WPF用戶控件不是數據綁定

我的用戶控件基本上是一個增強的組合框。 DP位於用戶控件內部。我在數據網格中使用這個用戶控件。

用戶控件的數據上下文像這樣設置。 的DataContext = {綁定的RelativeSource = {自我的RelativeSource}}

#region ProfileType DP 

    public static FrameworkPropertyMetadata ProfileTypeMetaData = new FrameworkPropertyMetadata(ProfileTypes.Default, 
                   FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | 
                   FrameworkPropertyMetadataOptions.Journal, new PropertyChangedCallback(ProfileType_PropertyChanged), 
                   new CoerceValueCallback(ProfileType_CoerceValue), 
                   false, UpdateSourceTrigger.PropertyChanged); 

    public static readonly DependencyProperty ProfileTypeProperty = DependencyProperty.Register(nameof(ProfileType), typeof(ProfileTypes), 
                    typeof(MyClass), ProfileTypeMetaData, new ValidateValueCallback(ProfileType_Validate)); 

    private static void ProfileType_PropertyChanged(DependencyObject dobj, DependencyPropertyChangedEventArgs e) 
    { 
     MyClass tp = (MyClass)dobj; 
     tp.SetUpProfiles(); 
    } 

    private static object ProfileType_CoerceValue(DependencyObject dobj, object Value) 
    { 
     return Value; 
    } 

    private static bool ProfileType_Validate(object Value) 
    { 
     return true; 
    } 

    public ProfileTypes ProfileType 
    { 
     get 
     { 
      return (ProfileTypes)this.GetValue(ProfileTypeProperty); 
     } 
     set 
     { 
      this.SetValue(ProfileTypeProperty, value); 
     } 
    } 

    #endregion 

在我的XAML文件我有以下幾點:

<DataGrid ItemsSource="{Binding Missmatches}" CanUserAddRows="False" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Target Profile" Binding="{Binding OldProfile}" /> 
      <DataGridTemplateColumn Header="Mismatched Profile"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Tekla:TeklaProfiles SelectedProfile="{Binding NewProfile}" ProfileType="{Binding Type}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

DataGrid綁定到一個ObservableCollection。集合中的每個對象都包含三個自動道具。

private ObservableCollection<ProfileMismatch> _missmatches; 
     public ObservableCollection<ProfileMismatch> Missmatches 
     { 
      get { return _missmatches; } 
      set 
      { 
       if (_missmatches == value) 
        return; 
       _missmatches = value; 
       RaisePropertyChanged(nameof(Missmatches)); 
      } 
     } 

無論我嘗試什麼,我似乎無法獲得用戶控制數據綁定。如果有人有一些專業提示,請讓我知道。

+0

「我的課程包含數據」:那是什麼在網格?它是什麼樣子的?什麼是「MyUserControls:Profiles」? 'ProfileType'與這個有什麼關係?可能有幾件事情在這裏出錯,但除非您提供足夠的代碼來重現問題,否則無法猜測。 –

+0

你是否正確設置了視圖的'DataContext'? – ChrisF

+0

是的。數據網格的第一列正確綁定。 –

回答

1

用戶控件的數據上下文像這樣設置。 DataContext={Binding RelativeSource={RelativeSource Self}}

刪除。顯式設置UserControl的DataContext可防止從控件的父級繼承DataContext,例如,這裏:

<DataTemplate> 
    <Tekla:TeklaProfiles SelectedProfile="{Binding NewProfile}" 
         ProfileType="{Binding Type}" /> 
</DataTemplate> 

預期將綁定逆水的DataContext有待解決,即具有NewProfileType屬性的圖模型對象。但是,由於您已明確設置UserControl的DataContext(自身),因此無法工作。


所以纔沒有明確設置用戶控件的DataContext的。決不。任何告訴你的博客或在線教程都是錯誤的。

+0

另請參閱[此答案](http://stackoverflow.com/a/25699347/1136211)和[這一個](http://stackoverflow.com/a/40674448/1136211)。 – Clemens