这不是问题,但我对问题的答案我无法在互联网上找到解决方案。
我在MVVM Silverlight应用程序中清除SearchText时遇到问题。我可以清除SelectedItem和Text,但是SearchText被遗忘了。它是只读的,不能通过绑定来更改。
示例:带有国家/地区列表的AutoCompleteBox。当用户想要进入澳大利亚时,他们进入'au'此时该列表与奥地利和澳大利亚一起出现。然后用户可以选择澳大利亚并继续前进。在编辑结束时,他们点击“保存”按钮。此时,您可能希望清除数据以输入新数据。
即使您绑定了SelectedItem和Text属性,并将它们分别设置为'null'和string.Empty,SearchText属性仍然存在,AutoCompleteBox将不会清除,但将包含'au'。
答案 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;