ComboBox с мульти-связыванием в качестве выбранного элемента? - PullRequest
4 голосов
/ 11 августа 2011

Я пытаюсь сделать следующее:

Связывание данных в Combobox

но с мульти-связыванием .. что означает, что я хочу более одного связывания ..

Таким образом, я могу отобразить, например, полное имя как имя + фамилия.

Как мы можем это сделать?

Спасибо!

Ответы [ 5 ]

8 голосов
/ 11 августа 2011

Добавить ItemTemplate как это:

<ComboBox.ItemTemplate>
    <DataTemplate>
        <TextBlock>
            <TextBlock.Text>
                <MultiBinding StringFormat="{}{0}, {1}">
                    <Binding Path="LastName" />
                    <Binding Path="FirstName" />
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </DataTemplate>
</ComboBox.ItemTemplate>

(StringFormat Ссылка )

Sidenote: InФактический код, который я чаще использую Метод Дина , но это способ MultiBinding делать вещи.

4 голосов
/ 11 августа 2011

Вы имеете в виду что-то простое, как это

<ComboBox>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <Run Text="{Binding FirstName}" />
                <Run Text=" " />
                <Run Text="{Binding LastName}" />
            </TextBlock>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
1 голос
/ 11 августа 2011

Создать MultiBinding следующим образом:

<Window x:Class="WpfTestApp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:WpfTestApp="clr-namespace:WpfTestApp" Title="MainWindow" Height="350" Width="525" >
<Window.Resources>
    <WpfTestApp:ConcatenateStringsConverter x:Key="_concatenateStringsConverter" />
</Window.Resources>

<Grid x:Name="LayoutRoot" Style="{StaticResource RectangleHighlighter}">
    <ComboBox Width="200" Height="40">
        <ComboBox.Items>
            <ComboBoxItem >
                <ComboBoxItem.Content>
                    <TextBlock>
                        <TextBlock.Text>
                            <MultiBinding Converter="{StaticResource _concatenateStringsConverter}">
                                <Binding Mode="OneWay" Path="FirstName" />
                                <Binding Mode="OneWay" Path="LastName" />
                            </MultiBinding>
                        </TextBlock.Text>
                    </TextBlock>
                </ComboBoxItem.Content>
            </ComboBoxItem>
        </ComboBox.Items>
    </ComboBox>

</Grid>
</Window>

Я использовал MainWindowViewModel в качестве DataContext окна:

public partial class MainWindow : Window
{
 public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainWindowViewModel();
    }
}


public class MainWindowViewModel :INotifyPropertyChanged
{
    public MainWindowViewModel()
    {
        FirstName = "Souvik";
        LastName = "Basu";
    }


    private string _firstName;
    public string FirstName
    {
        get { return _firstName; }
        set
        {
            if (_firstName != value)
            {
                _firstName = value;
                OnPropertyChange("FirstName");
            }
        }
    }
    private string _lastName;
    public string LastName
    {
        get { return _lastName; }
        set
        {
            if (_lastName != value)
            {
                _lastName = value;
                OnPropertyChange("LastName");
            }
        }
    }

    protected void OnPropertyChange(string propertyName)
    {
        if(PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

Преобразователь объединяет несколько значений привязки ..

class ConcatenateStringsConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return values[0].ToString() + " " + values[1].ToString();
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
1 голос
/ 11 августа 2011

Вы можете создать привязку как MultiBinding следующим образом:

<TextBlock>
  <TextBlock.Text>
    <MultiBinding Converter=" ... " ... >
      <Binding Path="FirstName" />
      <Binding Path="LastName" />
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>
0 голосов
/ 11 августа 2011

Пример, приведенный здесь, - почти то, что вам нужно.

http://msdn.microsoft.com/en-us/library/system.windows.data.multibinding.aspx

Просто поменяйте TextBlock на ComboBox и привяжите его к SelectedItem, а не к свойству Text.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...