我的组合框绑定了3个属性(IsVisited,地址和城市):
<ComboBox Height="100" HorizontalAlignment="Left" Margin="100,25,0,0" Name="ComboBox1" VerticalAlignment="Top" Width="300">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsVisited}" Width="150" />
<TextBlock Text="{Binding Address}" Width="100" />
<TextBlock Text="{Binding City}" Width="100" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
我想创建一个带有下拉列表的wpf组合框,其中包含两列
组合框的选定文本框部分应仅显示“地址”。有谁知道如何实现这一目标?
答案 0 :(得分:0)
一个有点hacky的解决方案是检查DataTemplate
是否在ComboBoxItem
内并隐藏不需要的值:
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsVisited}" Width="150" x:Name="chk"/>
<TextBlock Text="{Binding Address}" Width="100"/>
<TextBlock Text="{Binding City}" Width="100" x:Name="City"/>
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBoxItem}}}" Value="{x:Null}">
<Setter TargetName="City" Property="Visibility" Value="Collapsed"/>
<Setter TargetName="chk" Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ComboBox.ItemTemplate>
答案 1 :(得分:0)
我已经复制了你的问题,我已经完成了你的任务。
这是初步观点。
然后选择Kegalla后,
我认为这就是你所需要的。
为ComboBoxItem定义view model
。 (在我的例子中,我创建了一个名为MyComboBoxItem
的类,并包含属性HasVisited, Address, City, TextBoxValue
)
在主视图模型中,定义property
以绑定ComboBox ItemsSource
(我定义了一个名为ComboBoxItems
的属性)和另一个绑定{{1}的属性ComboBox(我定义了一个名为SelectedItem
的属性)。
在选择更改方法中,实施逻辑以设置texbox。
这是我的SelectedComboBoxItem
XAML
这是我<Window x:Class="ComboboxSelectedItemChange.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:vm="clr-namespace:ComboboxSelectedItemChange.ViewModels"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.DataContext>
<vm:MainViewModel />
</Grid.DataContext>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition Height="30" />
</Grid.RowDefinitions>
<Label Grid.Column="0" Grid.Row="0" Content="Combo box test" />
<ComboBox Grid.Column="1" Grid.Row="1"
ItemsSource="{Binding ComboBoxItems}"
SelectedItem="{Binding SelectedComboBoxItem}">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding HasVisited}" Width="30" />
<TextBlock Text="{Binding TextBoxValue}" Width="100" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding ChangeSelectionCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
</Grid>
绑定到上面的视图
Main View model
这是public class MainViewModel : ViewModelBase
{
#region Declarations
private ObservableCollection<MyComboBoxItemViewModel> comboBoxItems;
private MyComboBoxItemViewModel selectedComboBoxItem;
private ICommand changeSelectionCommand;
#endregion
#region Properties
/// <summary>
/// Gets or sets the combo box items.
/// </summary>
/// <value>The combo box items.</value>
public ObservableCollection<MyComboBoxItemViewModel> ComboBoxItems
{
get
{
return comboBoxItems;
}
set
{
comboBoxItems = value;
NotifyPropertyChanged("ComboBoxItems");
}
}
/// <summary>
/// Gets or sets the selected combo box item.
/// </summary>
/// <value>The selected combo box item.</value>
public MyComboBoxItemViewModel SelectedComboBoxItem
{
get
{
return selectedComboBoxItem;
}
set
{
selectedComboBoxItem = value;
NotifyPropertyChanged("SelectedComboBoxItem");
}
}
#endregion
#region Commands
/// <summary>
/// Gets the change selection command.
/// </summary>
/// <value>The change selection command.</value>
public ICommand ChangeSelectionCommand
{
get
{
if (changeSelectionCommand == null)
{
changeSelectionCommand = new RelayCommand(param => this.ChangeSelection(),
null);
}
return changeSelectionCommand;
}
}
#endregion
#region Constructors
/// <summary>
/// Initializes a new instance of the <see cref="MainViewModel"/> class.
/// </summary>
public MainViewModel()
{
//Add some dummy data
this.ComboBoxItems = new ObservableCollection<MyComboBoxItemViewModel>();
MyComboBoxItemViewModel item1 = new MyComboBoxItemViewModel();
item1.HasVisited = false;
item1.Address = "123, Matara";
item1.City = "Matara";
item1.TextBoxValue = item1.City;
this.ComboBoxItems.Add(item1);
MyComboBoxItemViewModel item2 = new MyComboBoxItemViewModel();
item2.HasVisited = false;
item2.Address = "125, Colombo";
item2.City = "Colombo";
item2.TextBoxValue = item2.City;
this.ComboBoxItems.Add(item2);
MyComboBoxItemViewModel item3 = new MyComboBoxItemViewModel();
item3.HasVisited = false;
item3.Address = "465, Kegalle";
item3.City = "Kegalle";
item3.TextBoxValue = item3.City;
this.ComboBoxItems.Add(item3);
this.SelectedComboBoxItem = item2;
this.ComboBoxItems.Where(item => item == this.SelectedComboBoxItem).First().TextBoxValue = this.SelectedComboBoxItem.Address;
}
#endregion
#region Private Methods
/// <summary>
/// Changes the selection.
/// </summary>
private void ChangeSelection()
{
foreach (var comboBoxitem in this.ComboBoxItems)
{
this.ComboBoxItems.Where(item => item == comboBoxitem).First().TextBoxValue = comboBoxitem.City;
}
this.ComboBoxItems.Where(item => item == this.SelectedComboBoxItem).First().TextBoxValue = this.SelectedComboBoxItem.Address;
this.ComboBoxItems.Where(item => item == this.SelectedComboBoxItem).First().HasVisited = true;
}
#endregion
}
MyComboBoxItemViewModel