2016-07-15 9 views
-4

C#WPFプロジェクトのComboBoxにTextBlockがあり、 'Name'とdouble 'Weight'プロパティを持つ 'Envelope'アイテムのリストにバインドされています、私はTextBlockに表示したいと思っています。ComboBoxのTextBlockにバインドされた文字列が表示されない

私のプログラムを実行すると、コンボボックスにテキストが表示されずに表示されます。適切に3つのラベルなしアイテムがあり、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; 
    } 
} 

答えて

-1

Nameフィールドで、あなただけのpropertiesに特異的に結合することができます。

+0

ありがとうございます。私はできるだけ受け入れます。 –

2

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です。

関連する問題