提前感谢您的帮助!
我有一个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中的对象..
非常感谢您的帮助!
答案 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来存储所有可能的值和默认值。