我在C#WPF项目的ComboBox中有一个TextBlock,该项目绑定到一个' Envelope'项目,有一个字符串'名称'和一个双倍的重量'属性,我希望在TextBlock中看到前者。
当我运行程序时,ComboBox显示时没有任何文本。它正确地有三个未标记的项目,如果我查看ComboBox的ItemsSource或SelectedItem它们显示适当的值,并且与ComboBox的SelectedItem交互的其他代码行为正常。唯一不起作用的是TextBlock不包含文本。如果我用"{Binding Name}"
替换"au ghdfjlnvgmumar"
,那么ComboBox中会出现相应的乱码,所以它肯定是绑定的问题。问题是什么,我该如何解决它?
相关代码:
XAML:
<ComboBox Name="EnvelopeList" HorizontalAlignment="Center" Width="200" >
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
C#:
//main window code
public MainWindow()
{
InitializeComponent();
envelopes = new List<Envelope>();
envelopes.Add(new Envelope("TEST", 0));
envelopes.Add(new Envelope("HI", 10));
EnvelopeList.ItemsSource = envelopes;
}
//Envelope class
class Envelope
{
public string Name;
public double Weight;
public Envelope()
{
Name = "[None]";
Weight = 0;
}
public Envelope(string n, double w)
{
Name = n;
Weight = w;
}
public override string ToString()
{
return Name;
}
}
答案 0 :(得分:3)
当DataBinding
时,您只能绑定到属性。此外,您需要使用PropertyChangedEvent
更新您的媒体资源。否则,如果您在初始绑定后更改了属性,则无法更新UI。
您需要在属性更改和属性
上使用 public class Envelope: ModelBase
{
private string _name;
public string Name
{
get { return _name; }
set { _name= value; OnPropertyChanged("Name"); }
}
}
public class ModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propName));
}
}
}
最后,我注意到您直接设置ItemsSource
。相反,您要设置自己的DataContext
属性,然后绑定到ItemsSource
这是MSDN article on DataBinding,它将教你如何正确地做到这一点。
答案 1 :(得分:0)
Name
是字段,您只能绑定到properties。