2017-04-17 77 views
1

我想顯示經由數據網格我的計算機的所有NetworkInterfaces和我有下面的類(也就是.xaml.cs控制器)結合列表 >到數據網格: WPF使用XAML

public partial class Network : Window 
{ 
    public Network() 
    { 
     PrintStatus(); 
     InitializeComponent(); 
    } 

    public void PrintStatus() 
    { 
     var bindingList = new List<KeyValuePair<string, object>>(); 

     foreach (NetworkInterface card in networkCards) 
     { 
      foreach (PropertyInfo prop in typeof(NetworkInterface).GetProperties()) 
       bindingList.Add(new KeyValuePair<string, object>(prop.Name, prop.GetValue(card, null))); 
     } 
    } 
} 

我試圖像下面,但不工作:

<DataGrid x:Name="NetInfo" ItemsSource="{Binding Source=bindingList}"> 
    <DataGrid.Columns>  
     <DataGridTextColumn Header="Key" Binding="{Binding Key}"/> 
     <DataGridTextColumn Header="Value" Binding="{Binding Value}"/>  
    </DataGrid.Columns> 
</DataGrid> 

在VisualStudio中,當我提出我的鼠標鍵或值在Binding標籤我得到的消息不能因解決未知DataContext

有人能告訴我我在做什麼錯了,所以,你可以看到我真的不知道如何工作的數據綁定^^。

+1

使用屬性公共的ObservableCollection <字典<串,對象>>的BindingList {得到;組; }並在PrintStatus()方法內爲此屬性添加值。 – user2526236

回答

1

bindingListPrintStatus()一個局部變量。這種方法以外是不可見的。你需要把物品放在視圖可以到達的地方。

public Network() 
{ 
    InitializeComponent(); 

    BindingList = new ObservableCollection<KeyValuePair<string, object>>(); 

    PrintStatus(); 
} 


public ObservableCollection<KeyValuePair<string, object>> BindingList { get; private set; } 

public void PrintStatus() 
{ 
    BindingList.Clear(); 

    foreach (NetworkInterface card in networkCards) 
    { 
     foreach (PropertyInfo prop in typeof(NetworkInterface).GetProperties()) 
     { 
      BindingList.Add(new KeyValuePair<string, object>(prop.Name, prop.GetValue(card, null))); 
     } 
    } 
} 

在XAML,你需要綁定到BindingList(我已經改變了你的資本,以符合標準的.NET做法)作爲窗口的屬性。它應該是你的viewmodel的一員。在這種情況下,你會綁定到{Binding BindingList}。但你沒有,所以這是行不通的。

默認情況下,DataGrid自動爲你給它的集合中的項目的每個屬性一列。由於您定義了自己的列,因此默認情況下會將其添加到這些列中。您可以通過設置AutoGenerateColumns="False"來關閉它,如下所示。

<DataGrid 
    x:Name="NetInfo" 
    AutoGenerateColumns="False" 
    ItemsSource="{Binding BindingList, RelativeSource={RelativeSource AncestorType=Window}}" 
    > 
    <DataGrid.Columns>  
     <DataGridTextColumn Header="Key" Binding="{Binding Key}"/> 
     <DataGridTextColumn Header="Value" Binding="{Binding Value}"/>  
    </DataGrid.Columns> 
</DataGrid> 

你也可以讓它繼續前進並自動生成列,並且不要自己定義列。如果您想定義自己的標題,或者更改格式,或者甚至省略一個或兩個不關心的列,那麼您的原始方法可以提供更大的靈活性。只涵蓋所有的基地。

<DataGrid 
    x:Name="NetInfo" 
    ItemsSource="{Binding BindingList, RelativeSource={RelativeSource AncestorType=Window}}" 
    /> 

DataContext = this;是不好的做法。在一個窗口中,它是相對無害的,但正如你在上面看到的那樣,這是不必要的。 RelativeSource綁定非常容易使用。如果你開始養成它的習慣,你會打破你的用戶控件的屬性綁定。它總是造成混亂。

+0

謝謝你現在幾乎可以工作,但在將代碼更改爲你提供的內容後發生了一件奇怪的事情:密鑰和值列以及它們的內容是雙重的,例如'Key |值| Key |價值' –

+1

@MartinNiederl哎呀,請參閱更新:我向'DataGrid'添加了'AutoGenerateColumns ='False''。您可以通過將其忽略(該屬性的默認值爲True)並省略DataGrid.Columns來獲得相同的效果 - 稍後我將添加該更新。 –

+0

@MartinNiederl查看新更新 –