2017-03-09 5 views
0

依存オブジェクトへのプロパティ変更するとき:バインディングエラー私は私のコントロールでクラスのシステムを使用するために以下のコードを使用しています

public class FlowProWorkingClass:DependencyObject 
{ 
    public TUnitSystemClass ProjectUnitSystem 
    { 
     get 
     { 
      return Classes.CurrentFlowProWorkingClass.GeneralOptions.listOfUnitSystems.Find(x => x.Id == Classes.CurrentFlowProWorkingClass.GeneralOptions.DefaultUnitSystemId); 
     } 
     set 
     { 
      throw new Exception("Project Unit System can not be setted here!");} 
     } 
} 

を、私は以下のように私のコントロールにバインドします:

<WPFTextBoxUnitConverterControl:TextBoxUnitConvertor 
    x:Name="txtGasPhaseFlowCoefficient" UnitSystem="{Binding currentFlowProWorkingClass.ProjectUnitSystem, Mode=OneWay, Source={StaticResource CurrentFlowProWorkingClass}, UpdateSourceTrigger=PropertyChanged}" 
    Height="27" Margin="167,245,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="171"/> 

このコードは現在動作しており、現在のシステムのシステムを取得しています。それが開いたときに、私は変化を通知するために、次のコードを追加するために最初のクラスを改訂するよう は現在、制御が必要となります。

public class FlowProWorkingClass:DependencyObject 
{ 
    [JsonIgnore] 
    public static readonly DependencyProperty ProjectUnitSystemProperty = 
     DependencyProperty.Register(
      "ProjectUnitSystem", 
      typeof(TUnitSystemClass), 
      typeof(FlowProWorkingClass), 
      new PropertyMetadata(ProjectUnitSystemOnChanged)); 

    private static void ProjectUnitSystemOnChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
    } 

    public TUnitSystemClass ProjectUnitSystem 
    { 
     get 
     { 
      SetValue(ProjectUnitSystemProperty, Classes.CurrentFlowProWorkingClass.GeneralOptions.listOfUnitSystems.Find(x => x.Id == Classes.CurrentFlowProWorkingClass.GeneralOptions.DefaultUnitSystemId)); 
      return (TUnitSystemClass) GetValue(ProjectUnitSystemProperty); 
     } 
     set 
     { 
      throw new Exception("Project Unit System can not be setted here!"); 
     } 
    } 
} 

が、今、コントロールが全くバインドされていません! 問題は何ですか? 注:私は下のコードを書いたとき、バインディングは完全に無視されます! getメソッドはまったく呼び出されません!どうして?

public static DependencyProperty ProjectUnitSystemProperty = 
    DependencyProperty.Register(
     "ProjectUnitSystem", 
     typeof(TUnitSystemClass), 
     typeof(FlowProWorkingClass), 
     new PropertyMetadata(ProjectUnitSystemOnChanged)); 

private static void ProjectUnitSystemOnChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
} 

public TUnitSystemClass ProjectUnitSystem 
{ 
    get 
    { 
     SetValue(ProjectUnitSystemProperty, Classes.CurrentFlowProWorkingClass.GeneralOptions.listOfUnitSystems.Find(x => x.Id == Classes.CurrentFlowProWorkingClass.GeneralOptions.DefaultUnitSystemId)); 
     return (TUnitSystemClass) GetValue(ProjectUnitSystemProperty); 
    } 
    set 
    { 
     throw new Exception("Project Unit System can not be setted here!"); 
    } 
} 
+0

私はそれを改訂しましたが、正しく表示されていません!私はそれを行うことはできませんいくつかの1つを編集するPLZ! – all

+0

プロパティーセッターからの例外の投げ捨てはまったく意味がありません。プロパティを読み取り専用にします。 – Clemens

+0

@clemens - プロパティはgetで取得される別のプロパティで別の方法から設定する必要があります。 "Classes.CurrentFlowProWorkingClass.GeneralOptions.listOfUnitSystems" – all

答えて

1

SetValue任意の以前に割り当てられた(一方向)結合置き換え依存性のいわゆるローカル値を設定します。

したがって、プロパティゲッターはバインディングを効果的に削除します。 SetValueに電話をかけてはいけません。

get 
{ 
    SetValue(ProjectUnitSystemProperty, ...); // remove this line 
    return (TUnitSystemClass)GetValue(ProjectUnitSystemProperty); 
} 

任意の読み取り/書き込み依存関係プロパティのCLRラッパーは正確に次のようになります。

public PropertyType PropertyName 
{ 
    get { return (PropertyType)GetValue(PropertyNameProperty); } 
    set { SetValue(PropertyNameProperty, value); 
} 

読み取り専用の依存関係プロパティは、MSDNのRead-Only Dependency Propertiesの記事を見てみてください。

+0

残念なことに、getは別のプロパティ "Classes.CurrentFlowProWorkingClass.GeneralOptions.listOfUnitSystems.Find(x => x.Id == Classes.CurrentFlowProWorkingClass.GeneralOptions.DefaultUnitSystemId)"から値を取得し、それを返す必要があります。 ! – all

+0

依存関係のプロパティはそのようには機能しません。 getterが呼び出される前にSetValue *を呼び出さなければなりません。ゲッターの内部では呼び出されません。 – Clemens

+0

私はプロパティの "Classes.CurrentFlowProWorkingClass.GeneralOptions.ListOfUni tSystems.Find(x => x.Id == Classes.CurrentFlowProWorkingClass.GeneralOptions.DefaultUni tSystemId)のリアルタイム値を取得する必要があります"!それをしてもいいですか? – all

関連する問題