我知道这是基本的,但我正在从vb.net跳转到C#,而我在vb.net中使用的方法似乎并没有起作用。 我已经使用自定义类服务创建了一个.dll 在我的项目中,我使用Service实例填充ObservableCollection。我想在XAML(WPF)中使用DisplayMemberPath在组合框中显示实例。
我的服务实例正在填充ComboBox,但每个项目的显示为空白;我只是得到一堆空行可供选择。
我已经尝试过在课堂上实施INotifyPropertyChanged并且没有在课堂上实施INotifyPropertyChanged,虽然我不认为此时应该是必要的,因为我还是在1号方面。
这是我的代码:
<Grid>
<ComboBox Name="TopService"
VerticalAlignment="Top"
ItemsSource="{Binding}"
DisplayMemberPath="{Binding ServCode}"></ComboBox>
</Grid>
这是我的代码背后:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Execute();
}
private void Execute()
{
SA.franchiseID = "HOL010";
ObservableCollection<Service> ocService = Service.InitializeServiceList();
TopService.DataContext = ocService;
}
}
该类的代码(通过.dll引用)
public class Service : INotifyPropertyChanged
{
#region INotifyPropertyChanged implementation
public event PropertyChangedEventHandler PropertyChanged;
protected void Notify(string propertyName)
{
if (this.PropertyChanged != null)
{ PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); }
}
#endregion
private string servCode;
public string ServCode
{
get { return servCode; }
set { servCode = value; Notify("ServCode"); }
}
public string programCode = "";
public int roundNum = 0;
public static ObservableCollection<Service> InitializeServiceList()
{
ObservableCollection<Service> oc = new ObservableCollection<Service>();
using (SA s = new SA())
{
s.SqlString = @"select
ps.serv_code
,pc.prgm_code
,ps.round
from prgmserv as ps
inner join prgmcd as pc on pc.progdefid = ps.progdefid
where pc.available = 1";
s.reader = s.command.ExecuteReader();
Service newService;
while (s.reader.Read())
{
newService = new Service();
newService.servCode = s.reader["serv_code"].ToString();
newService.programCode = s.reader["prgm_code"].ToString();
newService.roundNum = Convert.ToInt32(s.reader["round"].ToString());
oc.Add(newService);
newService = null;
}
return oc;
}
}
}
答案 0 :(得分:6)
DisplayMemberPath
is a string。你不能赋予它对财产的约束力;你只需给它一个属性的路径,然后通过反射查找它。
试试这个:
DisplayMemberPath="ServCode"
您正在做的事情会使ServCode
的值用作DisplayMemberPath
;如果ServCode是12
,它会在组合框中的每个项目上寻找一个名为12
的属性 - 不是你的意图,我确定。
答案 1 :(得分:1)
我在尝试将项目绑定到ItemsControl时也意识到,Field和Property之间的区别变得非常重要。我一直试图绑定到Fields,这是行不通的。这在技术上与VB.net没有什么不同。但是VB.net中隐式定义的属性看起来非常像C#中的Field。所有这一切,我相信我现在准备好征服世界了!