2012-04-16 4 views
0

バインドの動作が異常です。DataContext & IsEnabled UserControlのプロパティ。私のページでStrange Behavior UserControlのDataContextおよびIsEnabled-Propertyをバインドします。

、私はこのようなユーザーコントロールを使用します。

<httpsPort:HttpsPort DataContext="{Binding Path=Https}" 
    IsEnabled="{Binding CurrentServiceState, Converter={StaticResource ServiceStateIsConfigableConverter}}" /> 

そして、このようなボタン:

<Button Content="start service" 
    IsEnabled="{Binding CurrentServiceState, Converter={StaticResource ServiceStateIsConfigableConverter}}" 
    Command="{Binding CmdConfigureService}" [...] /> 

説明:

コンバータはにcurrentServiceState-列挙型を変換し、ブール私のボタンは、期待通りに動作します(En/DisAbled)。

問題:マイボタンが正しく有効/無効になっていますが、私のユーザコントロールのコントロールは正しくありません。

のDataContext(HTTPS)は、実際にnullではない:

private HttpsPortViewModel _https; 
    public HttpsPortViewModel Https 
    { 
     get 
     { 
      if (_https == null) 
      { 
       _https = new HttpsPortViewModel(); 
      } 
      return _https; 
     } 
     set 
     { 
      _https = value; 
      NotifyPropertyChanged(() => Https); 
     } 
    } 

私はバインディング私のUserControlに偽FallbackValue =を使用しようとしましたが、その後、ユーザーコントロールも無効である...

誰も説明できますこれらの行動? ありがとうございました。

更新:

マイ対処方法:あなたがあなた自身のDataContext結合するべきではありません

<Grid IsEnabled="{Binding CurrentServiceState, Converter={StaticResource ServiceStateIsConfigableConverter}}"> 
    <httpsPort:HttpsPort DataContext="{Binding Path=Https}" /> 
</Grid> 
+1

あなたは実際に問題を述べたことはありません。そうしてください。 –

+0

こんにちはダニエル、問題は、ユーザーコントロールがボタンのようにen/disabledされていないということです。 –

+0

DataContextプロパティをバインドすることはお勧めできません。なぜあなたはusercontrolのためにそれをしますか?それはそれなしのボタンのために働くようです。 –

答えて

0

。バインド操作はDataContextを使用しているため、DataContextのバインドは循環操作です。これが成功したとしても、バインディングがどのような順序で作成されるかは保証されていないので、DataContextが新しい値にバインドされる前に、IsEnabledプロパティがバインドされる可能性があります。

代わりに、プロパティのフルパスを指定する必要があります。例:

<httpsPort:HttpsPort IsEnabled="{Binding Https.CurrentServiceState, Converter={StaticResource ServiceStateIsConfigableConverter}}" /> 
+0

大丈夫、私はバインディング順序の問題を理解しています。主なアイデアは、ユーザーコントロールとしてコントロールのグループをアウトソーシングすることでした。これらのグループボックスは2つの(ページ)ViewModelで使用されます。これらのViewModelはUserControlViewModel(ポートと選択された証明書を取得)にアクセスする必要がありますが、(ページ)ビューモデルはユーザーコントロール(サービスの実行中など)を無効にできる必要があります。おそらく、私の "解決策"が最善​​の方法ではない... CurrentServiceStateはhttpsの属性ではなく、親ビューモデル(ページ) –

+0

の属性であることに注意してください。その後、各PageViewModelからUserControlViewModelを公開してください。 DataContextはPageViewModelをポイントしています。私の答えと同じように、ユーザーコントロールのプロパティをフルパスでバインドできます。 – GazTheDestroyer