在WPF控件中正确设置绑定
本文关键字:设置 绑定 WPF 控件 | 更新日期: 2023-09-27 18:24:55
我想将控件数据源设置为键值对的可观察集合,但只显示对的关键部分。
我有一个第三方多选组合框。
我已经修改了它附带的数据源类,以便它保存键值对集合。
这是类别:
public class DataSource : INotifyPropertyChanged
{
private ObservableCollection<KeyValuePair<string,string>> _items;
public DataSource(ObservableCollection<KeyValuePair<string, string>> items)
{
_items = items;
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
public ObservableCollection<KeyValuePair<string, string>> Items
{
get { return _items; }
}
private string _selectedItem = "";
public string SelectedItem
{
get { return _selectedItem; }
set
{
_selectedItem = value;
OnPropertyChanged("SelectedItem");
}
}
private ObservableCollection<KeyValuePair<string, string>> _selectedItems;
public ObservableCollection<KeyValuePair<string, string>> SelectedItems
{
get
{
if (_selectedItems == null)
{
_selectedItems = new ObservableCollection<KeyValuePair<string, string>> { new KeyValuePair<string,string>("ALL"," ") };
SelectedItemsText = WriteSelectedItemsString(_selectedItems);
_selectedItems.CollectionChanged +=
(s, e) =>
{
SelectedItemsText = WriteSelectedItemsString(_selectedItems);
OnPropertyChanged("SelectedItems");
};
}
return _selectedItems;
}
set
{
_selectedItems = value;
}
}
public string SelectedItemsText
{
get { return _selectedItemsText; }
set
{
_selectedItemsText = value;
OnPropertyChanged("SelectedItemsText");
}
} string _selectedItemsText;
private static string WriteSelectedItemsString(IList<KeyValuePair<string, string>> list)
{
if (list.Count == 0)
return String.Empty;
StringBuilder builder = new StringBuilder(list[0].Key);
for (int i = 1; i < list.Count; i++)
{
builder.Append(", ");
builder.Append(list[i].
);
}
return builder.ToString();
}
}
在我身后的代码中:
DataSource ds = new DataSource(materialNames);
cmbLastEditors.DataContext = ds;
在我的xaml中,我有:
<my1:MultiComboBox Name="cmbLastEditors" Grid.Row="8" Grid.Column="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" SelectionMode="Multiple" DisplaySeparator=", " ItemsSource="{Binding Items}" SelectedItems="{Binding SelectedItems}" />
我想做一些类似的事情
ItemsSource="{Binding Items.Key}"
有人能帮我吗?如果您需要更多信息,请告诉我。
您可以使用ItemTemplate来渲染列表中的每个项。类似这样的东西:
<my1:MultiComboBox ...>
<my1:MultiComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Key}"/>
</DataTemplate>
<my1:MultiComboBox.ItemTemplate>
</my1:MultiComboBox>
也就是说,假设您的自定义MultiComboBox支持正常的WPF ItemTemplate语义。
对于常规组合框,您有ValueMember
和DisplayMember
字段。其工作原理类似于DisplayMemberPath。请参阅此链接以获得更好的解释,但您的组合框应该如下所示:
<my1:MultiComboBox Name="cmbLastEditors"
Grid.Row="8" Grid.Column="1"
VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
SelectionMode="Multiple" DisplaySeparator=", "
ItemsSource="{Binding Items}"
SelectedItems="{Binding SelectedItems}"
DisplayMemberPath="Key" />
当然,我不确定这是否适用于您的第三方组合框。
如果不起作用,可以在组合框的ItemTemplate
中使用值转换器。例如,将转换器添加到ItemTemplate中的文本块,在其中绑定整个对象并使用转换器返回要显示的键值。
class MyKeyValueConverter : IValueConverter
{
public object Convert(object aValue)
{
var pair = aValue as KeyValuePair<string, string>;
return pair.Key;
}
}
<TextBlock Text="{Binding Path=., Converter={StaticResource myKeyValueConverter}}"/>