2011-12-23 5 views
0

私は簡単な問題を解決して頭を壊しました。私は、埋め込まれたテンプレートプロパティでカスタムコントロールを持っています。テンプレートは内部にTextBoxを持つ単純なグリッドです。このテキストボックスは、setterとgetterを持つシングルトンのproprtyにバインドされています。私はどのようにプログラムで強制的にシングルトンから値を読み取り、それを戻すTextBoxを強制することができますか?言い換えればTemplateControlからデータソースを更新する方法

<Window x:Class="Spike.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Window1" Height="305" Width="521" xmlns:my="clr-namespace:Spike" xmlns:Data="clr-namespace:Spike.Data"> 
    <Grid> 
     <Grid.Resources> 
      <ControlTemplate x:Key="editingTemplate"> 
       <Grid> 
        <TextBox Text="{Binding Source={x:Static Data:MyClass.Instance}, Path=Value2}"/> 
       </Grid> 
      </ControlTemplate> 
     </Grid.Resources> 

     <UserControl Template="{StaticResource editingTemplate}" HorizontalAlignment="Left" Margin="58,60,0,0" x:Name="myUserControl1" VerticalAlignment="Top" Height="75" Width="284" /> 
     <Button Content="Update source" Height="23" HorizontalAlignment="Left" Margin="184,23,0,0" Name="button1" VerticalAlignment="Top" Width="111" Click="button1_UpdateSource" Focusable="False" /> 
     <Button Content="Update control" Focusable="False" Height="23" HorizontalAlignment="Left" Margin="58,23,0,0" Name="button2" VerticalAlignment="Top" Width="111" Click="button2_UpdateControl" /> 
    </Grid> 
</Window> 
namespace Spike.Data 
{ 
    public class MyClass 
    { 
     private static readonly MyClass MyClassInstance = new MyClass(); 

     public MyClass() 
     { 
      Value1 = "value1"; 
      Value2 = "value2"; 
     } 

     public static MyClass Instance 
     { 
      get { return MyClassInstance; } 
     } 

     public string Value1 { get; set; } 

     public string Value2 { get; set; } 
    } 
} 

button2_UpdateControlbutton1_UpdateSource方法で実装すべきか?

は、任意のヘルプ

答えて

0

Aバインディングを手動で再起動することがないはずのために事前にありがとうございます。代わりに、現在のBindingメカニズムを正しく動作させるようにしてください。 TextBoxはDependancyPropertyにバインドするか、TextBoxのDataContextにINotifyPropertyChangedを実装する必要があります。 このようなあなたのValue2プロパティを定義します。

public static readonly DependencyProperty Value2Property = 
    DependencyProperty.Register("Value2", typeof(string), typeof(MyClass), new PropertyMetadata(string.Empty)); 

public string Value2 
{ 
    get { return (string)GetValue(Value2Property); } 
    set { SetValue(Value2Property, value); } 
} 

また、MyClassのはのUIElementを実装する必要があります。

+0

MyClassはINotifyPropertyChangedを実装できますが、これは問題ではありません。しかし、私はどのようにUserControlそのテンプレートについての知らずにバインドされたオブジェクトのTextBoxの更新値を強制することができます理解したい。 – user1113996

+0

UserControlはTextBoxを更新することを強制していません。 TextBoxはイベントにバインドし、それらのイベントに応答します。これがTextBoxの更新です。 UserControlは、TextBoxがバインドされていることを認識しないか、気にしません。別のバインディングコンテキストを持つことができる他のコントロールに(あなたのシナリオでは)コンテナとしての役割を果たすだけです。 –

+0

さて、ユーザーコントロールがいくつかのテンプレートを持つことができるグリッド内のセルであるとします.1つは通常の状態です。 2.データ編集中の別のテンプレート。ユーザーがセルをクリックすると、グリッドがテンプレートを変更します。新しいテンプレートを設定するときに、データオブジェクトから値を取得します。編集コントロールがフォーカスを失ったときに、いくつかのバリデーションプロセスでプロパティーのセッターを呼び出そうとします。フォーカスを失うことなく、このコントロールに変更された値をプログラムで強制的にコミットさせることは可能ですか? – user1113996

関連する問題