我需要一个控件来允许用户添加/删除/编辑键/值对的行。什么是最好的控制用于此?有人有例子吗?我对WPF很新。
答案 0 :(得分:5)
我使用带有两个带标签的文本框的简单对话,新对将添加到应绑定到DataGrid
的原始数据中,以便自动生成行。
编辑:一个DataGrid示例解决方案 XAML:
<Window
...
DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}">
<StackPanel Orientation="Vertical">
<DataGrid ItemsSource="{Binding GridData}"/>
</StackPanel>
</Window>
背后代码:
在窗口类中:
private ObservableCollection<Pair> gridData = new ObservableCollection<Pair>(new Pair[]{new Pair()});
public ObservableCollection<Pair> GridData
{
get { return gridData; }
}
配对课程:
public class Pair : INotifyPropertyChanged
{
private string key = "Key";
public string Key
{
get { return key; }
set
{
if (this.key != value)
{
key = value;
NotifyPropertyChanged("Key");
}
}
}
private double value = 0;
public double Value
{
get { return value; }
set
{
if (this.value != value)
{
this.value = value;
NotifyPropertyChanged("Value");
}
}
}
public Pair() { }
public Pair(string key, double value)
: this()
{
Key = key;
Value = value;
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
您应该能够添加具有正常DataGrid功能的新对。
答案 1 :(得分:1)
假设您正在使用MVVM,请在视图模型上使用对类型的ObservableCollection(或者如果您不想定义自己的类型,则可以使用System.Collections.Generic.KeyValuePair类型)。
您可以为用户提供两个文本框来添加新对,它会实例化您的对类型并将其添加到ObservableCollection中。您可以使用命令在视图模型上调用方法来执行此操作(或查看诸如Caliburn.Micro之类的框架,该框架支持基于约定的视图控件绑定,例如视图模型上的动词按钮)。
您可以使用ListBox来显示对的集合(只需将ListBox上的ItemsSource属性绑定到视图模型ObservableCollection对)。或者,如果您想支持现有对的内联编辑,那么DataGrid将是一个不错的选择。 DataGrid通过双击单元格值来支持内联编辑。您可以在DataGrid XAML中定义普通单元格模板和编辑单元格模板:
<DataGrid ItemsSource="{Binding MyPairsCollection}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Key">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Key}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Key}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
...
</DataGrid.Columns>
</DataGrid>