2016-02-26 43 views
0

所以我做了綁定之前,我不知道這次我的綁定有什麼問題。有人可以向我解釋爲什麼我不能將我的標籤綁定到適當的屬性?該列表框完美工作,如預期,但我不知道爲什麼標籤不工作。綁定問題與標籤,但不是列表框

XAML

<Label Content="{Binding MetricName}" Height="25"></Label> 
    <Label Content="{Binding MetricUnit}" Height="25"></Label> 
    <ListBox x:Name="EconomicSelection" Grid.Column="1" HorizontalAlignment="Left" Height="150" Margin="5,5,0,5" VerticalAlignment="Top" Width="399" FontFamily="{DynamicResource FontFamily}" FontSize="11" ItemsSource="{Binding EconomicBenchmarks}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <Label Content="P" Grid.Column="0"/> 
        <TextBox Text="{Binding Percentile}" Grid.Column="0" Width="30"/> 
        <Label Content="Value: " Grid.Column="1"/> 
        <TextBox Text="{Binding Value}" Grid.Column="1"/> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

C#

private Metric economicMetric; 

    public Metric EconomicMetric 
    { 
     get { return economicMetric; } 
     set 
     { 
      if (value == economicMetric) return; 
      economicMetric = value; 
      OnPropertyChanged(); 
     } 
    } 

    private string metricName; 

    public string MetricName 
    { 
     get { return metricName; } 
     set 
     { 
      if (value == metricName) return; 
      metricName = value; 
      OnPropertyChanged(); 
     } 
    } 

    private string metricUnit; 

    public string MetricUnit 
    { 
     get { return metricUnit; } 
     set 
     { 
      if (value == metricUnit) return; 
      metricUnit = value; 
      OnPropertyChanged(); 
     } 
    } 

    private ObservableCollection<EconomicBenchmark> economicBenchmarks = new ObservableCollection<EconomicBenchmark>(); 

    public ObservableCollection<EconomicBenchmark> EconomicBenchmarks 
    { 
     get { return economicBenchmarks; }    
    } 

    public EconomicMeasuresTable() 
    { 
     InitializeComponent(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public event EconomicMeasuresChangedEventHandler EconomicMeasuresChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     if (propertyName == "EconomicMetric") 
     { 
      metricName = economicMetric.EconomicName; 
      metricUnit = economicMetric.Unit; 
      economicBenchmarks.Clear(); 
      foreach (var economicBenchmark in economicMetric.EconomicBenchmarks) 
      { 
       economicBenchmarks.Add(economicBenchmark); 
      }    
     } 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));   
    } 

    private void SetButton_Click(object sender, RoutedEventArgs e) 
    { 
     if (EconomicMeasuresChanged != null) 
     { 
      EconomicMeasuresChanged(this, new EventArgs()); 
     } 
    } 
} 

public delegate void EconomicMeasuresChangedEventHandler(object sender, EventArgs e); 

列表

List<Metric> metrics = new List<Metric>(); 

     metrics.Add(new Metric { EconomicItem = "NVP", EconomicName = "Net Present Value", EconomicBenchmarks = GetEconomicBenchmarks(new[] { 10, 50, 90 }, new[] { 400, 550, 700 }), Unit = "$m" }); 
     metrics.Add(new Metric { EconomicItem = "ROI", EconomicName = "Return On Investment", EconomicBenchmarks = GetEconomicBenchmarks(new[] {10, 50, 90}, new[] {10, 20, 30}), Unit = "%" }); 
     metrics.Add(new Metric { EconomicItem = "STOIIP", EconomicName = "STOIIP", EconomicBenchmarks = GetEconomicBenchmarks(new[] {10, 50, 90}, new[] {500, 550, 600}), Unit = "MMbbl" }); 
+0

嘗試調試結合,看看exacly什麼這是一個關於如何調試綁定的好例子,請參閱[這裏](http://www.wpftutorial.net/DebugDataBinding.html) – Zippy

+0

另一種可以檢查綁定狀態的方法是使用[Snoop](https:/ /snoopwpf.codeplex.com/)。這可以讓你通過你的用戶界面可視範圍,並通過檢查'標籤'的綁定來查看它們的屬性是否在內部,你應該能夠看到它們是否被正確設置。 –

+0

你檢查了我的答案嗎? –

回答

1

你在這個代碼做什麼是可能不完整和有點奇怪。首先,我永遠不會使用OnPropertyChanged設置任何價值,但也許這就是隻有我的意見了......

不管怎樣,在你的代碼我們展示,您可以設置metricName和metricUnit在OnPropertyChanged如果財產是EconomicMetric。但是,您從不在任何地方設置EconomicMetric,因此綁定屬性將永遠不會被設置。您需要更好地查看代碼。

+0

嗯,我知道我沒有綁定到這個,這真的是我的問題我怎麼綁定到這個,我有一個解決方案,我被告知是舊的但它確實工作,但我只想知道如何綁定到經濟指標 –

1

我從你的代碼明白什麼是公制類包含EconomicBenchmarks,那你爲什麼不直接在集合捆綁,可欣賞這樣的收集,

<ListBox x:Name="EconomicSelection" Grid.Column="1" HorizontalAlignment="Left" Height="150" Margin="5,5,0,5" VerticalAlignment="Top" Width="399" FontSize="11" ItemsSource="{Binding EconomicMetric.EconomicBenchmarks}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <Label Content="P" Grid.Column="0"/> 
         <TextBox Text="{Binding Percentile}" Grid.Column="0" Width="30"/> 
         <Label Content="Value: " Grid.Column="1"/> 
         <TextBox Text="{Binding Value}" Grid.Column="1"/> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
+0

另外,當我做綁定到列表框itemsource所有我的項目是空白的,現在什麼原因? –