2010-12-10 18 views
6

私は文字列と私たちのtimeformatの間の変換に使用しているコンバータに問題があります。コンバータ自体は正常に動作し、このようにimplemenetedさ:双方向バインディングで現在のDataContextでIValueConverterを使用しています

[ValueConversion(typeof(string), typeof(SimpleTime))] 
    public class StringToSimpleTimeConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      // convert from string to SimpleTime and return it 
     } 
     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      // convert value from SimpleTime to string and return it 
     } 
    } 

コンバータを使用してXAMLは、このようなusercontrol.resourcesでコンバータ自体含まれていますプロパティが発生した場合

<converter:StringToSimpleTimeConverter x:Key="stringToSimpleTimeConverter"/> 

を(I

<DataTemplate x:Key="SimpleTimeEditingTemplate"> 
     <TextBox Text="{Binding, Converter={StaticResource stringToSimpleTimeConverter}, Mode=TwoWay}"/> 
</DataTemplate> 

iが遭遇だ問題がCONことである:「simpletimeを編集するためのDataTemplateが使用されている)、バックグラウンドでWPFツールキットからのデータグリッドを用いたMそれが2ウェイコンバータであればバインダで指定されたパスを持つ必要がありますが(両方向で必要です)、設定したいプロパティはすでに現在のDataContextです。

私が考えることができる唯一の回避策は、現在のSimpleTimeを取得または設定するSimpleTimeにダミープロパティを導入することです。正常に動作しますが、私はより多くの時間のためのコンバータを必要とする場合は特に、本当に適切な解決策ではありません

<TextBox Text="{Binding Clone, Converter={StaticResource stringToSimpleTimeConverter}, Mode=TwoWay}"/> 

経由

public class SimpleTime 
{ 
    ... 
    public SimpleTime Clone 
    { 
     get { return new SimpleTime(_amount, _format); } 
     set { this._amount = value._amount; this._format = value._format; } 
    } 
} 

、その一つに結合し...

任意の助けていますお礼 歓声、マンニー

答えて

5

は、私はあなたがこの

<TextBox Text="{Binding Path=DataContext, 
         RelativeSource={RelativeSource Self}, 
         Converter={StaticResource stringToSimpleTimeConverter}, 
         Mode=TwoWay}"/> 
+0

私はテキストボックスの親usercontrolとdatacontextへのバインディングを使用して同様のアプローチを試みました。 IValueConverterは、文字列をsimpletimeに変換するために正しく呼び出され、文字列をコントロールに表示するために戻されますが、データ構造内のsimpletimeプロパティのセットは決して呼び出されません。 – manni

+0

@manni:これでテストアプリを作ったんだけど、うまく動いているようだ。それ自身のDataContextにバインドするので、それが機能しない理由はありません。 ConvertBackメソッドが呼び出されないことは確かですか? –

+1

努力をいただきありがとうございます。私は私が言っていることを意味するものは十分ではないと思う:私は私のconvertbackとconvertメソッドは、私はGUIの値を変更する場合、それは正常に動作しています呼び出されます。私が設定しているプロパティ(simpletimeプロパティ)のプロパティセッターは呼び出されません(ブレークポイントはトリガーされません)。私はそれを今見てみましょう、あなたの助けをありがとう、私は本当に感謝します。 – manni

0

ダミーのプロパティをクラスに導入する代わりに、次のようなコンテナクラスを作成してください。

public class Container 
{ 
    public Object DataItem { get; set; } 

    //... 
} 

など、それを使用します。

<TextBox Text="{Binding DataItem, Converter={StaticResource stringToSimpleTimeConverter}, Mode=TwoWay}"/> 

これが破損している/あなたの既存のクラスを変異させ、まだあなたはあなたがしたい何をすることはできません。

+0

良いアイデアのようにそれを回避することができると思いますが、私のデータ構造のために実際に実行可能ではありません。私はすべてのプロパティをコンテナに入れたいわけではなく、親のListオブジェクトはDataGridに直接バインドされています。このDataGridはクラスの各プロパティを表示および編集する列を選択します。 。 – manni

+1

あなたがしていることは、各プロパティを 'Control'の' DataContext'として設定し、パスを指定せずに '{Binding} 'を使ってバインドすることだと思います。これがあなたがやっていることならば間違っている。親コントロールの 'DataContext'を設定し、すべての子コントロールがそれを派生させる必要があります。また、子コントロール内の異なるパスを使用するバインディングのみを使用します。 – decyclone

+0

私はdatagridcolumnsがそのように働いたと思った。表示または編集するデータグリッド内のグリッドセルに使用するデータテンプレートは、完全な構造体に設定されたdatacontextを持つことはできません。これは、それが適用される属性の名前になっていることを意味します。私が望むのは、特定の型にデータ型を適用することです。そのため、コードビハインドはdatagridcolumnのバインディングを設定し、表示および編集用のデータ型を設定します。多くの試みと思考の後に、 – manni

関連する問題