我创建了ObservableCollection:
public ObservableCollection<Tool> toolList = new ObservableCollection<Tool>();
我在构造函数中设置了DataContext:
public MainWindow()
{
InitializeComponent();
DataContext = toolList;
}
实际:
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
公开名单:
public ObservableCollection<Tool> ToolList
{
get { return toolList; }
}
如何将对象添加到列表中:
private void buttonAdd_Click(object sender, RoutedEventArgs e)
{
InputDialog input = new InputDialog();
input.ShowDialog();
inputNewTool = input.enteredTxt;
if (inputNewTool != null)
{
System.Windows.Forms.MessageBox.Show("Chose the Tool's directory");
dlg.DefaultExt = ".exe";
dlg.Filter = "Application (.exe)|*.exe";
if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
Tool tool = new Tool();
tool.Name = inputNewTool;
tool.Path = dlg.FileName;
toolList.Add(tool);
}
}
}
我希望在comboBox上只显示Toolobject的名称。 XAML:
<ComboBox ItemsSource="{Binding Path= ToolList}" DisplayMemberPath="Name"
SelectedValuePath ="Name" SelectedValue="{Binding Path=ToolList}" Height="22"
Name="comboBoxTools" Width="185" IsEditable="False" />
编辑:现在xaml显示:
<ComboBox ItemsSource="{Binding Path= ToolList,
UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="Name"
Toolclass:
public class Tool
{
public string Name { get; set; }
public string Path { get; set; }
public Tool() { }
}
我在comboBox中看不到任何内容。为什么?这些工具成功添加到Collection中。 我生气了
答案 0 :(得分:3)
您已将Window的DataContext设置为ObservableCollection
本身。
因此,{em>绑定ItemsSource与DataContext本身,因为Binding
将自动指向List实例。
<ComboBox ItemsSource="{Binding}"/>
OR
理想情况下,您应该将DataContext设置为自身:
DataContext = this;
此外,SelectedValue
仅指向列表。这没有任何意义。如果不使用SelectedValuePath
,它应该指向类工具的实例。如果使用SelectedValuePath,它应该指向string类型的属性。
完全删除它或在课堂上将其设置为正确的实例。
答案 1 :(得分:0)
尝试在您的ItemsSource-Binding中将UpdateSourceTrigger
设置为PropertyChanged
答案 2 :(得分:0)
好的,我在youtube上找到了一个简单的解决方案(来自ht195367的Windows Presenation Foundation数据绑定)。我没有在Xaml中定义comboBox.ItemsSource,而是在Window_Loaded中定义。
comboBoxTools.ItemsSource = toolList;
为了显示我在工具类中实现ToStringng的工具的名称:
public override string ToString()
{
return Name;
}