大家好我想在我的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的方式,或者我可以通过其他任何方式实现同样的事情。任何帮助都会非常有用。
答案 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。