0

と が空でない場合にのみ有効にする必要がTextBoxある検索があります。ButtonTextBox

を使用しているので、ブール値を返す関数を持つ にMVVM Lightボタンをバインドしました。RelayCommandCanExecute

Buttonコードは次のとおりです。

<Button Grid.Row="0" Grid.Column="1" HorizontalAlignment="Center" Margin="10" VerticalAlignment="Center" BorderThickness="1" Style="{StaticResource ButtonNoPadding}" Command="{Binding SearchCommand}">
    <Rectangle Fill="{StaticResource PhoneForegroundBrush}" Width="40" Height="40" >
        <Rectangle.OpacityMask>
            <ImageBrush ImageSource="../Assets/AppBar/feature.search.png" />
        </Rectangle.OpacityMask>
    </Rectangle>
</Button>

関数Commandによって返される と プロパティは次のとおりです。CanExecute

/// <summary>
/// Boolean that enables/disables the search button
/// </summary>
public bool CanSearch
{
    get
    {
        return !string.IsNullOrEmpty(SearchQuery) && NetworkUtils.IsNetworkAvailable;
    }
}

/// <summary>
/// Command used to search for data
/// </summary>
private RelayCommand _searchCommand;
public RelayCommand SearchCommand
{
    get
    {
        return _searchCommand ?? new RelayCommand(ExecuteSearch, () => CanSearch);
    }
}

お気づきかもしれませんが、CanSearchプロパティは文字列の長さに依存しSearchQueryます。

ここでの問題は、戻ってページを再度ロードするまで、この文字列が常に null であることです。これは、ページをリロードした場合にのみ、テキストとプロパティが更新されることを意味します。

私はこの回答に従ってこの問題を修正SearchQueryし、テキストが変更されるたびに(フォーカスが失われたときだけでなく)更新を行いましたが、それでも機能しません。

これが私のTextBoxコードです:

<TextBox Grid.Row="0" Grid.Column="0" Text="{Binding SearchQuery, Mode=TwoWay}" VerticalAlignment="Center">
    <i:Interaction.Behaviors>
        <utils:UpdateSourceOnTextChangedBehavior/>
    </i:Interaction.Behaviors>
</TextBox>

添付の動作は次のとおりです。

public class UpdateSourceOnTextChangedBehavior : Behavior<TextBox>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.TextChanged += OnTextChanged;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.TextChanged -= OnTextChanged;
    }

    private void OnTextChanged(object sender, RoutedEventArgs e)
    {
        AssociatedObject.GetBindingExpression(TextBox.TextProperty).UpdateSource();
    }
}

面白いのは、 でAssociatedObject.GetBindingExpression(TextBox.TextProperty).UpdateSource();文字を変更するたびに が呼び出されるため、必要な処理を実際に実行することTextBoxです。

もちろん、SearchQueryプロパティは必要なすべてのイベントを発生させます。

/// <summary>
/// Query used to search in the API
/// </summary>
private string _searchQuery;
public string SearchQuery
{
    get
    {
        return _searchQuery;
    }
    set
    {
        if (_searchQuery == value) return;
        _searchQuery = value;
        RaisePropertyChanged(() => SearchQuery);
        RaisePropertyChanged(() => CanSearch);                
        SearchCommand.RaiseCanExecuteChanged();
    }
}

何か案が?

4

1 に答える 1