2016-11-28 10 views
-1

私のユーザコントロールには、データバインディングではない依存関係プロパティがあります。私はいくつかのスタックオーバーフローポストを見てきました。私は何が間違っているのか分かりません。 Property changedメソッドは呼び出されません。現在までのコード:WPF User Control Not Data Binding

私のユーザーコントロールは基本的に拡張コンボボックスです。 DPはユーザーコントロールの内部にあります。私はこのユーザーコントロールをデータグリッド内で使用しています。

ユーザーコントロールのデータコンテキストは、このように設定されています。 のDataContext =私は、次のしている私のXAMLファイルで

#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 

を{RelativeSource = {RelativeSource自己を}}バインディング:

<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にバインドされています。コレクション内の各オブジェクトには、3つの自動小道具が含まれています。

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> 

バインディングは即ちNewProfileType性のビューモデルオブジェクト、現在のDataContextに対して解決されることが期待されます。しかし、UserControlのDataContextを明示的に設定しているので、それは機能しません。


したがって、明示的にUserControlのDataContextを設定しないでください。決して。あなたに言っているブログやオンラインチュートリアルは間違っています。

+0

を見ていますまた、[この回答](http://stackoverflow.com/a/25699347/1136211)と[this one](http://stackoverflow.com/a/40674448/1136211)も参照してください。 – Clemens