2014-07-18 78 views
0

嗨,大家好我要訪問我的DataGrid控件在我viewmodel.I知道這是不正確的方式,但我不得不這樣做:如何從視圖訪問我的viewmodel中的我的datagrid控件?

<DataGrid 
     Grid.Row="1" 
     Margin="10,10,0,0" 
     Height="200" 
     Width="500" 
     Grid.ColumnSpan="2" 
     Name="dg" 
     HorizontalAlignment="Left" 
     AutoGenerateColumns="False" 
     ItemsSource="{Binding SSID}" 
     > 
       <DataGrid.Columns> 
        <DataGridTextColumn Width="100" Header="Network ID" Binding="{Binding _networkID}"></DataGridTextColumn> 
        <DataGridTextColumn Width="100" Header="SSID" Binding="{Binding _ssid}"></DataGridTextColumn> 
        <DataGridTextColumn Width="100" Header="VLAN" Binding="{Binding _vlan}"></DataGridTextColumn> 


</DataGrid.Columns> 


void AddSSIDs() 
     { 
      var ssid = new SSIDPropertyClass(); 

      ssid._networkID = SSID.Count + 1; 

      ssid._ssid = EnteredSSIDAC; 

      ssid._vlan = VlanSSID; 

      if (ACSelectedSecurityType=="Static WEP") 
      { 
       ssid._authenticationMode = ACSelectedSecurityType; 

       ssid._authentication = ACStaticWEPSelectedAuthentication; 

       ssid._staticWEPKeyType = ACStaticWEPSelectedKeyType; 

       ssid._staticWEPKeyLength = ACStaticWEPSelectedKeyLength; 

       ssid._staticWEPKey1 = StaticWEPKey1; 

       ssid._staticWEPKey2 = StaticWEPKey2; 

       ssid._staticWEPKey3 = StaticWEPKey3; 

       ssid._staticWEPKey4 = StaticWEPKey4; 

       SSID.Add(ssid); 


      } 

      else if(ACSelectedSecurityType=="WPA/WPA2 Personal") 
      { 

       ssid._authenticationMode = ACSelectedSecurityType; 

       ssid._wpaPersonalKeyAC = WpaACKey; 

       SSID.Add(ssid); 
      } 

     } 

我想顯示只有Datagrid中在if塊中選擇的列和否則在block中。如果block的第一個條件滿足比其他所有其他列的條件都滿足,則應該隱藏塊。請告訴我直接在ViewModel中訪問數據網格的方式,或者我可以通過其他任何方式實現同​​樣的事情。任何幫助都是非常可觀的。

+2

在MVVM中訪問ViewModel是一種不好的做法。 –

回答

1

你可以colunm知名度道具綁定到你的視圖模型道具:

<DataGridTextColumn Width="100" Header="Network ID" Binding="{Binding _networkID}" Visibility="{Binding NetworkVisibility}"></DataGridTextColumn> 
<DataGridTextColumn Width="100" Header="SSID" Binding="{Binding _ssid}" Visibilty="{Binding SSIDVisible, Converter={StaticResource SSIDVisible}}"></DataGridTextColumn> 

在視圖模型

public Visibility NetworkVisibility 
    { 
    get { 
      if(condition) return Visibility.Visible; 
     else return Visibility.Collapsed; 
     } 
    } 

,或者你可以做一個bool類型的視圖模型道具,那麼就使用BoolToVisibilityConverter在XAML

public bool SSIDVisible 
    { 
     get { 
       if(condition) return true; 
      else return false; 
      } 
    } 

而對於這個道具,你可以使用NotifyPropertyChanged(如果它的應該動態改變),正如Andrew Stephens的回答。

+0

額外的列仍在顯示? – Sapper

+0

當然,您只能爲可根據條件隱藏的列指定「可見性綁定」。只要你喜歡,你可以在視圖模型中爲每一列指定許多單獨的道具。 – Den

1

您可以創建包含有關列選擇狀態信息的屬性,例如bool值,並將它們綁定到列的Visible屬性。使用轉換器將bool轉換爲Visibility。

0

一個壞的習慣,但因爲你希望它這樣做的方式..

從代碼把它作爲參數傳遞給視圖模型視圖的後面。

1

您可以從虛擬機中暴露幾個布爾屬性,指出要顯示哪組列,然後將每列的Visibility屬性綁定到相關屬性。您需要使用BooleanToVisibilityConverter將布爾值轉換爲可見性值(可見或摺疊)。事情是這樣的: -

<Window.Resources> 
    <BoolToVisibilityConverter x:Key="boolToVisConv" /> 
</Window.Resources> 

<DataGridTextColumn Visibility="{Binding ShowWep, Converter={StaticResource boolToVisConv}" ... />  
<DataGridTextColumn Visibility="{Binding ShowWpa, Converter={StaticResource boolToVisConv}" ... /> 

編輯(如要求一些VM代碼) 你的VM類應執行INotifyPropertyChanged,其屬性setter必須提高PropertyChanged事件的值更改時。這可以確保綁定到屬性的視圖中的任何內容在其值發生更改時都會作出反應(例如刷新)。 INPC接口的典型示例請參見here。基於此代碼,ShowWpa屬性看起來像這樣: -

public class MyViewModel 
{ 
    private bool _showWpa; 

    public bool ShowWpa 
    { 
     get 
     { 
      return _showWpa; 
     } 
     set 
     { 
      if (_showWpa != value) 
      { 
       _showWpa = value; 
       NotifyPropertyChanged("ShowWpa"); 
      } 
     } 
    } 

    //etc.. 
} 
+0

你能說明如何實現ShowWep屬性嗎? – Sapper

+0

@Sapper請參閱編輯 –

相關問題