C#WPF Comboboxes ListView;告知用户其中一个Comboboxes的SelectionChanged

时间:2014-03-06 13:54:57

标签: c# wpf listview combobox selectionchanged

提前感谢您的帮助!

我有一个listview,向用户显示一个ComboBoxes列表,他可以在其中选择不同的单位。它看起来与此相似:

<ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Name="ChangedIndicator"
                                   Text="#"
                                   Visibility="{Binding DefaultChanged, 
                                   Converter={StaticResource BoolToVis}}"/>
                        <TextBlock Text="{Binding Path=Name}"
                                   Margin="5"
                                   MinWidth="210"
                                   TextAlignment="Center"/>
                        <ComboBox  ItemsSource="{Binding Units}"
                                   DisplayMemberPath="Symbol" 
                                   SelectedValue="{Binding DefaultUnit.Key}" 
                                   SelectedValuePath="Key"
                                   Name="UserChangesComboBox">
                            <ComboBox.ItemTemplate>
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal">
                                        <TextBlock Text="{Binding Symbol}"/>
                                        <TextBlock Text=" ("/>
                                        <TextBlock Text="{Binding Key}"/>
                                        <TextBlock Text=")"/>
                                    </StackPanel>
                                </DataTemplate>
                            </ComboBox.ItemTemplate>
                        </ComboBox> 
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>

现在,我的问题:

如您所见,我想向用户显示在Combo旁边的文本框中以“#”形式所做的任何更改。如果用户更改了某个组合框的选择,我想显示“#”。我正在使用visibilityConverter,但这不是问题。基本上我想要一个Boolean或类似的属性,当为每个组合引发SelectionChanged时,每个组合都是如此。或者也许这个想法走向了错误的方向,你们中的某个人可以帮助我解决这个问题。

我想要这样的事情:

  (#)    Speed -> [m/s]
                  [km/h]

而'#'表示此组合框中的用户更改! []基本上是组合框,它有两种选择..

但问题是所有组合框都是ObservableCollection中的对象..

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我认为你所采用的方法是在同一个viewmodel中创建DefaultChanged bool属性,该属性同时保存带有SelectedItem属性的组合框项集合。

每当selectedItem发生变化时,您都会将DefaultChanged设置为true,并且“#”将出现在您的视图中。

答案 1 :(得分:0)

如果您只想表明更改的文本框,我会在文本框的visibility属性上使用多重绑定。这有效:

<ListView Name="LV_Items">
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="#">
                        <TextBlock.Visibility>
                            <MultiBinding Converter="{StaticResource NonEqualValuesToVisibilityConverter}">
                                <Binding Path="ComboDefaultValue" Mode="OneWay"></Binding>
                                <Binding ElementName="CB_Selection" Path="SelectedValue" Mode="OneWay"></Binding>
                            </MultiBinding>
                        </TextBlock.Visibility>
                    </TextBlock>

                    <ComboBox Name="CB_Selection"  
                              ItemsSource="{Binding ComboItems}"
                              DisplayMemberPath="Item2" 
                              SelectedValue="{Binding ComboDefaultValue, Mode=OneTime}" 
                              SelectedValuePath="Item1">

                    </ComboBox>
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

多值转换器的代码:

public class NonEqualValuesToVisibilityConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (values == null || values.Length != 2)
        {
            return Visibility.Hidden;
        }

        return values[0].Equals(values[1]) ? Visibility.Hidden : Visibility.Visible;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

listview绑定到像这样的项目集合:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var items = new List<MyListViewItemData>();

        items.Add(new MyListViewItemData()
            {
                ComboDefaultValue = 1,
                ComboItems = new List<Tuple<int, string>>(){ new Tuple<int, string>(1, "m/s"), new Tuple<int, string>(2, "km/h") }
            });

        items.Add(new MyListViewItemData()
            {
                ComboDefaultValue = 10,
                ComboItems = new List<Tuple<int, string>>() { new Tuple<int, string>(10, "seconds"), new Tuple<int, string>(20, "minutes") }
            });

        LV_Items.ItemsSource = items;
    }
}

public class MyListViewItemData
{
    public List<Tuple<int, String>> ComboItems { get; set; }

    public int ComboDefaultValue { get; set; }
}

我选择了一个任意类MyListViewItemData来存储所有可能的值和默认值。