Windows 8 Combobox占位符文本

时间:2013-06-27 11:55:42

标签: windows-8

我正在使用“visual studio express for windows 8”并使用Combo Box控件作为

<ComboBox Name="Categories" >
                <x:String>apple</x:String>
                <x:String>ball</x:String>
                <x:String>cat</x:String>
                <x:String>dog</x:String>                    
            </ComboBox>

我想在其中显示占位符文字以显示一些文字,直到用户没有从中选择任何项目。但是,当我使用microsoft reference中描述的属性 PlaceholderText 来显示文本时,但是当我使用它时,sdk会显示此错误

  

无法识别或无法访问成员“PlaceholderText”。

还是有其他任何方法,以便我可以在Combobox中显示一些默认文本。 感谢。

1 个答案:

答案 0 :(得分:0)

这适用于Windows 8.1预览版,而不适用于Windows 8开发版。您需要先安装预览,然后才能使用此组合框进行开发。查看占位符的文档,它指出:

Minimum supported client    Windows 8.1 Preview 

修改

要手动执行此操作,只需手动预加载组合框。这是一个例子,让我们从ViewModel开始,构造函数将初始值加载到名为“Loading”的组合框中

public class MainVM : INotifyPropertyChanged
{

    private List<string> _dataList;

    public List<string> ComboData
    {
        get { return _dataList; }
        set
        {
            if (_dataList != value)
            {
                _dataList = value;
                OnPropertyChanged();
            }
        }
    }

    public MainVM()
    {
        ComboData = new List<string> {"Loading..."};
    }

    #region INotify Property Changed Implementation
    /// <summary>
    /// Event raised when a property changes.
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Raises the PropertyChanged event.
    /// </summary>
    /// <param name="propertyName">The name of the property that has changed.</param>
    public void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion
}

现在在主页面上xaml绑定到ComboData,但我们需要警惕第一种情况,其中一个项目的列表将加载,并且我们想要使所选项目。

<ComboBox ItemsSource="{Binding ComboData}"  Height="30"  Width="300" Loaded="OnLoaded" /> 

好的,在页面后面的代码中,我们将datacontext设置为我们之前设置的ViewModel,但也有一个OnLoaded方法,用于检查1项加载情况。在下面的例子中,我们模拟了加载其余数据的3秒延迟。

public sealed partial class MainPage : Page
{

    public MainVM ViewModel { get; set; }

    public MainPage()
    {
        this.InitializeComponent();
        DataContext = ViewModel = new MainVM();
    }


    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        var cBox = sender as ComboBox;

        if (cBox != null)
        {
            if ((cBox.Items != null) && (cBox.Items.Count == 1))
            {
                cBox.SelectedIndex = 0;

                // Debug code to simulate a change
                Task.Run(() =>
                    {
                        // Sleep 3 seconds
                        new System.Threading.ManualResetEvent(false).WaitOne(3000);

                        Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                            { ViewModel.ComboData = new List<string> {"Alpha", "Gamma", "Omega"}; });

                    });

            }
        }
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
    }
}