と が空でない場合にのみ有効にする必要がTextBox
ある検索があります。Button
TextBox
を使用しているので、ブール値を返す関数を持つ にMVVM Light
ボタンをバインドしました。RelayCommand
CanExecute
の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();
}
}
何か案が?