AutoCompleteBox和SearchText清除

时间:2011-02-02 15:36:20

标签: silverlight-4.0 autocompletebox

这不是问题,但我对问题的答案我无法在互联网上找到解决方案。

我在MVVM Silverlight应用程序中清除SearchText时遇到问题。我可以清除SelectedItem和Text,但是SearchText被遗忘了。它是只读的,不能通过绑定来更改。

示例:带有国家/地区列表的AutoCompleteBox。当用户想要进入澳大利亚时,他们进入'au'此时该列表与奥地利和澳大利亚一起出现。然后用户可以选择澳大利亚并继续前进。在编辑结束时,他们点击“保存”按钮。此时,您可能希望清除数据以输入新数据。

即使您绑定了SelectedItem和Text属性,并将它们分别设置为'null'和string.Empty,SearchText属性仍然存在,AutoCompleteBox将不会清除,但将包含'au'。

6 个答案:

答案 0 :(得分:2)

我在互联网上发布了这个,但是控制器本身没有得到答案,所以我从不同的角度来看待它,这可能会帮助像我一样最终感到沮丧的人。

我正在使用Silverlight导航模板应用程序,该应用程序使用NavigationFrame来加载Silverlight页面。我注意到,如果我导航到另一个页面并返回到我的数据表单,则清除了SearchText。绑定到属性的任何值仍然有效,只是SearchText已在所有AutoCompleteBox上清除。因此,我使用PageConductor方法将NavigationFrame注入ViewModel,我可以在其中调用refresh方法。我从Silverlight Firestarter事件的John Papa example获得了这个方法,我只是在IPageConductor接口中添加了一个Refresh方法,所以我现在可以调用'PageConductor.Refresh()',就像重新加载页面一样。我希望这可以帮助那些人。

答案 1 :(得分:1)

var t = ProductCombo.ItemsSource;
ProductCombo.ItemsSource = null;
ProductCombo.Text = string.Empty;
ProductCombo.SelectedValue = null;
//ProductCombo.Text = string.Empty;
ProductCombo.ItemsSource = t;

请试一试。这对我有用

答案 2 :(得分:1)

您必须清除Bindeaded到SelectedItem Binded属性的set部分内的Text的属性,如下所示:

    public string AnalisisText
    {
        get { return _analisisText; }

        set
        {
            if (_analisisText == value)
            {
                return;
            }

            _analisisText = value;

            RaisePropertyChanged(AnalisisTextPropertyName);
        }
    }

    public DatosAutoCompletaPedidosDetalleViewDTO AnalisisSelect
    {
        get { return _analisisSelect; }

        set
        {
            if (_analisisSelect == value)
            {
                return;
            }


            _analisisSelect = value;

            if (_analisisSelect == null) AnalisisText = "";

            RaisePropertyChanged(AnalisisSelectPropertyName);
        }
    }

因此,当您将null设置为属性SelectedItem时,另一个属性将设置为“”。

答案 3 :(得分:1)

我发现最简单的方法是扩展AutoCompleteBox:

public class AutoCompleteBoxClear : AutoCompleteBox
{
    public AutoCompleteBoxClear()
    {
        DataContextChanged += (o, e) =>
        {                
            if (SelectedItem == null)
                Text = string.Empty;
        };
    }
}

现在在XAML中使用新的AutoCompleteBoxClear控件。

仅当autocompletebox datacontext更改为null(即用户在数据表单中单击添加)时,才会清除文本。

注意:我认为DataContextChanged仅在Silverlight 5中可用,但我猜这些天仍然使用Silverlight的人现在可能已经升级了......

答案 4 :(得分:0)

  

var t = ProductCombo.ItemsSource;   ProductCombo.ItemsSource = null;   ProductCombo.Text = string.Empty;   ProductCombo.SelectedValue = null;   //ProductCombo.Text = string.Empty;   ProductCombo.ItemsSource = t;

不幸的是,这是代码隐藏的,我需要一个MVVM解决方案。

答案 5 :(得分:-1)

当然,SearchText属性是只读的,但我们可以获取AutoCompleteBox的子组件:

var searchText = autoCompBox.GetChildByType<TextBox>(item => item.Name == "Text");

现在我们可以通过TextBox-component的Text属性重置SearchText:

if (searchText != null) searchText.Text = string.Empty;

在C#6.0中,它更简洁:

autoCompBox.GetChildByType<TextBox>(item => item.Name == "Text")?.Text = string.Empty;