2011-08-11 45 views
4

我试图做到以下几点:与所选项目进行多重绑定的组合框?

Data Binding in Combobox

但多结合..这意味着我要超过一个结合更多..

所以我可以显示,例如,作为全名名字+姓氏。

我们该怎么做?

谢谢!

+0

我做不应该认为应该在应该管理的SelectedItem上设置这样的绑定什么是选择,而不是什么显示.. –

+0

以及有点清楚,不在选定的项目,但显示给用户..对象列表。 – Rushino

回答

8

添加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 Reference

旁注:在实际的代码中,我更频繁地使用Dean's method,但是这是做事的方式MultiBinding。

+0

谢谢!正是我在找什么。 – Rushino

+0

与Dean方法相比有什么优势? – Rushino

+0

@Rushino:根据字符串格式的复杂性,它只是简短(尽管不太纯)。 –

1

您可以创建一个绑定,MultiBinding如下:

<TextBlock> 
    <TextBlock.Text> 
    <MultiBinding Converter=" ... " ... > 
     <Binding Path="FirstName" /> 
     <Binding Path="LastName" /> 
    </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 
+0

谢谢,但为什么我会使用转换器?我不能给+1,因为它缺乏主要的东西..物品模板,否则它会工作,我猜。只是不知道把你的代码放在哪里。 – Rushino

+1

没关系投票。我想你错过了模板和绑定的基本概念。组合控件是基元之间最复杂的控件之一。我假设你已经知道如何应用DataTemplate以及如何创建一个简单的绑定。我的片段是关于如何应用多重绑定的一个通用示例。我认为问题在于多重绑定是如何工作的,而不是解决您的特定问题。我建议你先从简单的东西开始,否则你会在短时间内感到困惑。 –

+0

好吧,你说我错过了很多WPF概念。我对此很新颖。其实我正在努力学习它硬核的方式。我可能会收到一本关于这方面的书。但感谢您的评论。 – Rushino

4

你指的是一些简单的像这样

<ComboBox> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock> 
       <Run Text="{Binding FirstName}" /> 
       <Run Text=" " /> 
       <Run Text="{Binding LastName}" /> 
      </TextBlock> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 
+0

多重绑定更优雅。 – Rushino

+0

不,SelectedItem是绑定到 –

+0

的数据项你能解释一下吗?什么是“RUN”呢? – Rushino

0

这里给出的例子是几乎所有你所需要的。

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

只是交换TextBlock的一个组合框,并绑定到它的SelectedItem而不是Text属性。

+0

这是关于转换器的讨论..没有什么与我需要的真正相关。它甚至不显示如何应用于组合框。 – Rushino

+0

我投票支持@ H.B.的解决方案,因为它最能解答您的问题。请记住,虽然你的要求不会需要改变太多,你会超过StringFormat。如果两个变量都可用,则转换器可以处理显示由空格分隔的名字和姓氏,并且如果名字例如为空,则只有名字(没有空格)。 –

1

这样创建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(); 
    } 
} 
+0

有点太复杂,我需要但谢谢! – Rushino