1

我的组合框绑定到 3 个属性(IsVisited、Address 和 City):

<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 组合框

  1. 已访问(复选框)
  2. 城市(字符串)

组合框的选定文本框部分应仅显示“地址”。有谁知道如何实现这一目标?

4

2 回答 2

0

一个有点 hacky 的解决方案是检查您DataTemplate是否在 a 内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>
于 2013-04-03T18:27:52.103 回答
0

我已经重现了你的问题,我已经完成了你的任务。

这是最初的看法。

在此处输入图像描述

然后在选择了 Kegalla 之后,

在此处输入图像描述

我认为这就是你所需要的。

  1. 为 ComboBoxItem定义一个view model。(在我的情况下,我创建了一个名为MyComboBoxItem并包含属性的类HasVisited, Address, City, TextBoxValue

  2. 在您的主视图模型中,定义一个property绑定 ComboBox ItemsSource(我定义了一个名为 的属性ComboBoxItems)和另一个绑定SelectedItemComboBox 的属性(我定义了一个名为 的属性SelectedComboBoxItem)。

  3. 在选择更改方法中,实现您的逻辑来设置 texbox。

这是我的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

public class MyComboBoxItemViewModel : ViewModelBase
{ 
    #region Declarations

    private bool hasVisited;
    private string address;
    private string city;
    private string textBoxValue;

    #endregion

    #region Properties

    /// <summary>
    /// Gets or sets a value indicating whether this instance has visited.
    /// </summary>
    /// <value>
    ///     <c>true</c> if this instance has visited; otherwise, <c>false</c>.
    /// </value>
    public bool HasVisited
    {
        get
        {
            return hasVisited;
        }
        set
        {
            hasVisited = value;
            NotifyPropertyChanged("HasVisited");
        }
    }

    /// <summary>
    /// Gets or sets the address.
    /// </summary>
    /// <value>The address.</value>
    public string Address
    {
        get
        {
            return address;
        }
        set
        {
            address = value;
            NotifyPropertyChanged("Address");
        }
    }

    /// <summary>
    /// Gets or sets the city.
    /// </summary>
    /// <value>The city.</value>
    public string City
    {
        get
        {
            return city;
        }
        set
        {
            city = value;
            NotifyPropertyChanged("City");
        }
    }

    /// <summary>
    /// Gets or sets the text box value.
    /// </summary>
    /// <value>The text box value.</value>
    public string TextBoxValue
    {
        get
        {
            return textBoxValue;
        }
        set
        {
            textBoxValue = value;
            NotifyPropertyChanged("TextBoxValue");
        }
    }

    #endregion
}
于 2013-04-04T05:52:21.877 回答