2015-09-02 180 views
0

我遇到了一個問題,試圖綁定一個對象的屬性,這已經是另一個對象的屬性。當我綁定上層對象的屬性時,一切正常,但是當我試圖綁定一個屬性的屬性時,它不顯示任何內容。如何綁定已經是已綁定對象屬性的對象的屬性?

這裏是我的代碼:XAML

<Window x:Class="WpfTutorialSamples.ListView_control.ListViewColumnSortingSample" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="ListViewColumnSortingSample" Height="200" Width="550"> 
    <Grid Margin="10"> 
     <ListView Name="lvUsers"> 
      <ListView.Resources> 
       <Style TargetType="ListViewItem"> 
        <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
       </Style> 
      </ListView.Resources> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Width="120" DisplayMemberBinding="{Binding Transponder}"> 
         <GridViewColumn.Header> 
          <GridViewColumnHeader Tag="Transponder" Click="lvUsersColumnHeader_Click">Transponder</GridViewColumnHeader> 
         </GridViewColumn.Header> 
        </GridViewColumn> 
        <GridViewColumn Width="80" DisplayMemberBinding="{Binding Tipo}"> 
         <GridViewColumn.Header> 
          <GridViewColumnHeader Tag="Tipo" Click="lvUsersColumnHeader_Click">Tipo</GridViewColumnHeader> 
         </GridViewColumn.Header> 
        </GridViewColumn> 
        <GridViewColumn Width="110" DisplayMemberBinding="{Binding Destruida}"> 
         <GridViewColumn.Header> 
          <GridViewColumnHeader Tag="Destruida" Click="lvUsersColumnHeader_Click">Destruida</GridViewColumnHeader> 
         </GridViewColumn.Header> 
        </GridViewColumn> 
        <GridViewColumn Width="80" > 
         <GridViewColumn.Header> 
          <GridViewColumnHeader Tag="Combustible">Combustible</GridViewColumnHeader> 
         </GridViewColumn.Header> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 

           <ComboBox SelectionChanged="ComboBox_StopChanges" DataContext="{Binding Combustible}"> 
            <ComboBox.Resources> 
             <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}">White</SolidColorBrush> 
            </ComboBox.Resources> 

            <ComboBox.Items> 
             <StackPanel Orientation="Horizontal"> 
              <StackPanel> 
               <StackPanel Name="stckContentLeft"> 
                <Label BorderBrush="White" BorderThickness="1" Content="Loaded :" FontSize="12" FontWeight="SemiBold" Foreground="Black" Height="25" HorizontalAlignment="Left" Margin="2,2,0,0" VerticalAlignment="Top" Width="95"/> 
                <Label BorderBrush="White" BorderThickness="1" Content="Used :" FontSize="12" FontWeight="SemiBold" Foreground="Black" Height="25" HorizontalAlignment="Left" Margin="2,2,0,0" VerticalAlignment="Top" Width="95"/> 
               </StackPanel> 
              </StackPanel> 
              <StackPanel> 
               <StackPanel Name="stckContentRigth"> 
                <TextBox Name="textBoxLoaded" Height="25" Width="115" MaxLength="3" Margin="2,2,0,0" BorderBrush="Black" BorderThickness="1" FontSize="12" FontWeight="SemiBold" HorizontalAlignment="Left" Text="{Binding Cargado}" VerticalAlignment="Top" /> 
                <TextBox Name="textBoxUsed" Height="25" Width="115" MaxLength="3" Margin="2,2,0,0" BorderBrush="Black" BorderThickness="1" FontSize="12" FontWeight="SemiBold" HorizontalAlignment="Left" Text="{Binding Usado}" VerticalAlignment="Top" /> 
               </StackPanel> 
              </StackPanel> 
             </StackPanel> 
            </ComboBox.Items> 
           </ComboBox> 

          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
       </GridView> 
      </ListView.View> 
     </ListView> 
    </Grid> 
</Window> 

和C#代碼:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Media; 

namespace WpfTutorialSamples.ListView_control 
{ 
    public partial class ListViewColumnSortingSample : Window 
    { 
     private GridViewColumnHeader listViewSortCol = null; 
     private SortAdorner listViewSortAdorner = null; 

     public ListViewColumnSortingSample() 
     { 
      InitializeComponent(); 
      List<User> items = new List<User>(); 
      items.Add(new User() { Transponder = "M001", Tipo = "UH60", Destruida = Estado_Aeronave.Destruida, combustible = new Combustible() {Cargado = 4000, Usado = 3000} }); 
      items.Add(new User() { Transponder = "M002", Tipo = "UH70", Destruida = Estado_Aeronave.Funcional, combustible = new Combustible() { Cargado = 3000, Usado = 2000 } }); 
      items.Add(new User() { Transponder = "M003", Tipo = "UH80", Destruida = Estado_Aeronave.Funcional, combustible = new Combustible() { Cargado = 2000, Usado = 1000 } }); 
      items.Add(new User() { Transponder = "M004", Tipo = "UH90", Destruida = Estado_Aeronave.Destruida, combustible = new Combustible() { Cargado = 1000, Usado = 500 } }); 
      lvUsers.ItemsSource = items; 
     } 

     private void lvUsersColumnHeader_Click(object sender, RoutedEventArgs e) 
     { 
      GridViewColumnHeader column = (sender as GridViewColumnHeader); 
      string sortBy = column.Tag.ToString(); 
      if (listViewSortCol != null) 
      { 
       AdornerLayer.GetAdornerLayer(listViewSortCol).Remove(listViewSortAdorner); 
       lvUsers.Items.SortDescriptions.Clear(); 
      } 

      ListSortDirection newDir = ListSortDirection.Ascending; 
      if (listViewSortCol == column && listViewSortAdorner.Direction == newDir) 
       newDir = ListSortDirection.Descending; 

      listViewSortCol = column; 
      listViewSortAdorner = new SortAdorner(listViewSortCol, newDir); 
      AdornerLayer.GetAdornerLayer(listViewSortCol).Add(listViewSortAdorner); 
      lvUsers.Items.SortDescriptions.Add(new SortDescription(sortBy, newDir)); 
     } 



     private void ComboBox_StopChanges(object sender, SelectionChangedEventArgs e) 
     { 
      ComboBox snd = sender as ComboBox; 
      snd.SelectedIndex = -1; 
     } 
    } 

    public enum Estado_Aeronave { Destruida, Funcional }; 

    public class Combustible 
    { 
     public int Cargado { get; set; } 
     public int Usado { get; set; } 
    } 

    public class User 
    { 
     public string Transponder { get; set; } 

     public string Tipo { get; set; } 

     public Estado_Aeronave Destruida { get; set; } 

     public Combustible combustible { get; set; } 
    } 

    public class SortAdorner : Adorner 
    { 
     private static Geometry ascGeometry = 
       Geometry.Parse("M 0 4 L 3.5 0 L 7 4 Z"); 

     private static Geometry descGeometry = 
       Geometry.Parse("M 0 0 L 3.5 4 L 7 0 Z"); 

     public ListSortDirection Direction { get; private set; } 

     public SortAdorner(UIElement element, ListSortDirection dir) 
      : base(element) 
     { 
      this.Direction = dir; 
     } 

     protected override void OnRender(DrawingContext drawingContext) 
     { 
      base.OnRender(drawingContext); 

      if (AdornedElement.RenderSize.Width < 20) 
       return; 

      TranslateTransform transform = new TranslateTransform 
        (
          AdornedElement.RenderSize.Width - 15, 
          (AdornedElement.RenderSize.Height - 5)/2 
        ); 
      drawingContext.PushTransform(transform); 

      Geometry geometry = ascGeometry; 
      if (this.Direction == ListSortDirection.Descending) 
       geometry = descGeometry; 
      drawingContext.DrawGeometry(Brushes.Black, null, geometry); 

      drawingContext.Pop(); 
     } 
    } 
} 

如果你能幫助我將永遠感謝您。

祝您有愉快的一天。

+0

請具體談談哪一個元素(一個或多個)都無法正確顯示,以及你期望他們展示什麼。此外,雖然上面的代碼示例相當短,但如果您提供[良好,_minimal_,_complete_代碼示例](https://stackoverflow.com/help/mcve)可以可靠地再現問題,則會更好。換句話說,你應該從上面的代碼示例中刪除所有不再需要重現問題的東西。 –

+0

對不起,我試圖顯示Combobox中的元素。感謝您的建議,下次我會盡量縮短它。 –

回答

1

設置DataContext的實際屬性名稱:

<ComboBox SelectionChanged="ComboBox_StopChanges" DataContext="{Binding combustible}"> 

然後將文本框綁定到根據成員:

<TextBox Name="textBoxLoaded" Height="25" Width="115" MaxLength="3" Margin="2,2,0,0" BorderBrush="Black" BorderThickness="1" FontSize="12" FontWeight="SemiBold" HorizontalAlignment="Left" Text="{Binding Path=Cargado}" VerticalAlignment="Top" /> 

<TextBox Name="textBoxUsed" Height="25" Width="115" MaxLength="3" Margin="2,2,0,0" BorderBrush="Black" BorderThickness="1" FontSize="12" FontWeight="SemiBold" HorizontalAlignment="Left" Text="{Binding Path=Usado}" VerticalAlignment="Top" /> 
+0

你說得對,這是屬性名稱中的一個簡單錯誤。它應該是「可燃」而不是「可燃」。即使使用Path =也沒有必要 –

+0

非常感謝!我不相信我錯過了那一個。這是該屬性名稱中的一個簡單錯誤。而@YacoubMassad是正確的,Path =甚至沒有必要。 –

0

以下添加到用戶等級:

public Combustible[] CombustibleArray 
    { 
     get { return new[] {combustible}; } 
    } 

然後,而不是組合框結合combustible,其綁定到CombustibleArray,就像這樣:

<ComboBox SelectionChanged="ComboBox_StopChanges" DataContext="{Binding CombustibleArray}"> 

你的代碼是不工作的原因ComboBox數據上下文期望某種數組。它將使用數組中的第一個項目作爲ComboBox中的第一個項目。這正是我所建議的修改所要做的。

+0

謝謝,這個效果很好,如果我需要的話,我會認爲它是未來的替代品。但是,Datacontext可以同時處理數組和對象屬性。 –