如何从视图中访问我的viewmodel中的datagrid控件?

时间:2014-07-18 07:50:16

标签: c# wpf mvvm datagrid

大家好我想在我的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块中选择的列,如果是块,则显示块。如果第一个if块的条件满足,则其他列存在于其他列中,如果块应该被隐藏。请告诉我我可以直接在ViewModel中访问datagrid的方式,或者我可以通过其他任何方式实现同​​样的事情。任何帮助都会非常有用。

4 个答案:

答案 0 :(得分:1)

您可以创建包含有关列选择状态的信息的属性,例如bool值,并将它们绑定到列的Visible属性。使用转换器从bool转换为Visibility。

答案 1 :(得分:1)

您可以将colunm visibility prop绑定到viewmodel prop:

<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>

在ViewModel中

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

或者您可以使用bool类型的viewmodel道具,然后在XAML中使用BoolToVisibilityConverter

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

对于这个道具,你可以使用NotifyPropertyChanged(如果它应该动态改变),就像Andrew Stephens的回答一样。

答案 2 :(得分:1)

您可以从VM公开几个布尔属性,指示要显示的列集,然后将每列的Visibility属性绑定到相关属性。您需要使用BooleanToVisibilityConverter将布尔值转换为可见性值(Visible或Collapsed)。这样的事情: -

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

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

修改(根据要求提供一些虚拟机代码) 您的VM类应实现INotifyPropertyChanged,并且其属性设置者必须在值更改时引发PropertyChanged事件。这可确保绑定到属性的视图中的任何内容在其值更改时作出反应(例如刷新)。可以在here中找到INPC接口的典型示例。根据此代码,ShowWpa属性将如下所示: -

public class MyViewModel
{
    private bool _showWpa; 

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

    //etc..
}

答案 3 :(得分:0)

一种不好的做法,但因为你希望以这种方式完成..

从视图后面的代码中将它作为参数传递给ViewModel。