WPF ComboBox显示问题

时间:2013-03-15 21:02:02

标签: wpf data-binding mvvm binding wpf-controls

我有一个绑定到User对象集合的ComboBox。组合的DisplayMemberPath设置为“Name”,即User对象的属性。我还有一个文本框绑定到ComboBox.SelectedItem绑定的同一个对象。因此,当我更改TextBox中的文本时,我的更改会立即反映在组合中。只要Name属性未设置为空,这正是我想要发生的。在这种情况下,我想替换一段通用文本,例如“{Please Supply a Name}”。不幸的是,我无法弄清楚如何这样做,所以在这方面的任何帮助将不胜感激!

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow"
    Width="340"
    SizeToContent="Height"
    WindowStartupLocation="CenterScreen"
    ResizeMode="NoResize">
<StackPanel>
    <TextBlock Text="ComboBox:" />
    <ComboBox SelectedItem="{Binding SelectedUser}"
              DisplayMemberPath="Name"
              ItemsSource="{Binding Users}" />
    <TextBlock Text="TextBox:"
               Margin="0,8,0,0" />
    <TextBox Text="{Binding SelectedUser.Name, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>

public class ViewModel : INotifyPropertyChanged
{
    private List<User> users;
    private User selectedUser;

    public event PropertyChangedEventHandler PropertyChanged;

    public List<User> Users
    {
        get
        {
            return users;
        }
        set
        {
            if (users == value)
                return;

            users = value;

            RaisePropertyChanged("Users");
        }
    }

    public User SelectedUser
    {
        get
        {
            return selectedUser;
        }
        set
        {
            if (selectedUser == value)
                return;

            selectedUser = value;

            RaisePropertyChanged("SelectedUser");
        }
    }

    private void RaisePropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;

        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class User
{
    public string Name { get; set; }
}

2 个答案:

答案 0 :(得分:1)

看看这个post。有几个答案可能符合您的要求。

答案 1 :(得分:0)

您可以使用TargetNullValue

<StackPanel>
    <TextBlock Text="ComboBox:" />
    <ComboBox SelectedItem="{Binding SelectedUser}" ItemsSource="{Binding Users}" >
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock 
                    Text="{Binding Name, TargetNullValue='Enter some text'}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
    <TextBlock Text="TextBox:"
        Margin="0,8,0,0" />
    <TextBox Text=
             "{Binding SelectedUser.Name, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>

并将空名称转换为null。

public class User 
{
    private string name;

    public string Name
    {
        get
        {
            return this.name;
        }
        set
        {
            this.name = (string.IsNullOrEmpty(value)) ? null : value;

            // probably best raise property changed here
        }
    }
}