0

UserControlのバインディングDataContextとプロパティの奇妙な動作があります。IsEnabled

私のページでは、次のようなUserControlを使用しています。

<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-Enumをboolに変換します。ボタンは期待どおりに動作します(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);
        }
    }

UserControlsバインディングでFallbackValue=Falseを使用しようとしましたが、UserControlが無効になっています...

誰かがこれらの行動を説明できますか?どうもありがとう。

アップデート:

私の回避策:

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

1 に答える 1

0

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

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

<httpsPort:HttpsPort IsEnabled="{Binding Https.CurrentServiceState, Converter={StaticResource ServiceStateIsConfigableConverter}}" />
于 2012-04-16T09:56:09.873 に答える