如何从视图访问我的视图模型中的数据网格控件

本文关键字:视图 数据 数据网 网格 控件 模型 访问 我的 | 更新日期: 2023-09-27 18:13:39

我想在我的视图模型中访问我的数据网格控件。我知道这是不正确的方式,但我必须这样做:

<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);
            }
        }

我想只显示数据网格中的列,这些列是在if块和其他if块中选择的。如果第一个if块的条件是满足的,那么所有其他列都应该被隐藏。请告诉我,我可以访问数据网格直接在ViewModel或任何其他方式,我可以实现同样的事情的方式。

如何从视图访问我的视图模型中的数据网格控件

您可以将列可见性prop绑定到视图模型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类型的视图模型道具,然后在XAML中使用BoolToVisibilityConverter

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

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

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

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

<Window.Resources>
    <BoolToVisibilityConverter x:Key="boolToVisConv" />
</Window.Resources>
<DataGridTextColumn Visibility="{Binding ShowWep, Converter={StaticResource boolToVisConv}" ... />    
<DataGridTextColumn Visibility="{Binding ShowWpa, Converter={StaticResource boolToVisConv}" ... />

Edit(一些虚拟机代码)你的VM类应该实现INotifyPropertyChanged,并且它的属性设置必须在值改变时引发PropertyChanged事件。这确保了绑定到属性的视图中的任何内容在其值发生变化时都会做出反应(例如刷新)。可以在这里找到INPC接口的一个典型示例。基于这段代码,ShowWpa属性看起来像这样:-

public class MyViewModel
{
    private bool _showWpa; 
    public bool ShowWpa
    {
        get
        {
            return _showWpa;
        }
        set
        {
            if (_showWpa != value)
            {
                _showWpa = value;
                NotifyPropertyChanged("ShowWpa");
            }
        }
    }
    //etc..
}

这是一个不好的做法,但是既然您希望这样做……

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