繁体   English   中英

绑定到TextBox的字符串未更新

[英]String bound to TextBox is not updating

我有一个TextBox和一个搜索Button ,只有当TextBox不为空时才必须启用它。

由于我使用的是MVVM Light ,因此已将按钮绑定到具有CanExecute函数的RelayCommand ,该函数仅返回布尔值。

这是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>

这是CanExecute函数返回的Command和属性:

/// <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();
    }
}

任何想法?

线

return _searchCommand ?? new RelayCommand(ExecuteSearch, () => CanSearch);

没有设置_searchCommand字段。 也许做一个新的RelayCommand搞砸了吗?

尝试以下方法:

 return (_searchCommand != null) ? _searchCommand : _searchCommand = new RelayCommand(ExecuteSearch, () => CanSearch);

这会延迟创建并正确设置_searchCommand。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM