问题:DataGrid显示为空,但是我有信息,我的DataGrid
收到了信息但仍然是空的!
我的XAML:
<DataGrid x:Name="dataGrid" Grid.Row="1" ItemsSource="{Binding ViewList}"
CanUserAddRows="False" AlternationCount="2"
AlternatingRowBackground="Blue">
<DataGrid.Columns>
<DataGridTextColumn Header="View" Binding="{Binding id}"
Width="2*" IsReadOnly="True" />
<DataGridTemplateColumn Header="Is Enabled" Width="Auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding isEnabled, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
我的ViewModel:
public ConfigRoleModel()
{
_viewList = new ObservableCollection<ViewList>(WCFclient.getListOfViews(1));
}
private ObservableCollection<ViewList> _viewList;
public ObservableCollection<ViewList> ViewList
{
get { return _viewList; }
set
{
_viewList = value;
OnPropertyChanged("ViewList");
}
}
ViewList类:
public class ViewList
{
public int id;
public string description;
public string code;
}
我该如何解决?
答案 0 :(得分:1)
查看您的代码:
您应该在ViewList类中定义公共属性以便绑定工作。
将Datacontext设置为viewModel。
DataContext中没有isEnabled属性
您的ViewList类应如下所示:
public class ViewList
{
public int Id { get; set; }
public bool IsEnabled { get; set; }
...
}
和您的Xaml:
<DataGrid x:Name="dataGrid" Grid.Row="1" ItemsSource="{Binding ViewList}"
CanUserAddRows="False" AlternationCount="2" AlternatingRowBackground="Blue" >
<DataGrid.Columns>
<DataGridTextColumn Header="View" Binding="{Binding Id}" Width="2*" IsReadOnly="True" />
<DataGridTemplateColumn Header="Is Enabled" Width="Auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsEnabled , Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
在您的视图代码中或在您的xaml本身中:
答案 1 :(得分:0)
字段不是WPF绑定的有效目标。你应该使用一个属性。
public class ViewList {
public int Id { get; set; }
public string Description { get; set; }
public string Code { get; set; }
public bool IsEnabled { get; set; }
}
答案 2 :(得分:0)
确保您的View List类实现了INotifyPropertyChanged
public class ViewList : INotifyPropertyChanged
{
private int _id;
public int id
{
get { return _id; }
set
{
_id = value;
OnPropertyChanged(new PropertyChangedEventArgs("id"));
}
}
private string _description;
public string description
{
get { return _description; }
set
{
if((value as string) != null)
{
_description = value;
OnPropertyChanged(new PropertyChangedEventArgs("description"));
}
}
}
private string _code;
public string code
{
get { return _code; }
set
{
_code = value;
OnPropertyChanged(new PropertyChangedEventArgs("code"));
}
}
private bool _isEnabled;
public bool isEnabled
{
get { return _isEnabled; }
set
{
_isEnabled = value;
OnPropertyChanged(new PropertyChangedEventArgs("isEnabled"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
{
PropertyChanged(this, e);
}
}
}
如果您只想显示ObservableCollection中的数据,则ViewModel不需要实现INotifyPropertyChanged。这是我的ViewModel:
public class MainWindowVM
{
private ObservableCollection<ViewList> _MyList;
public ObservableCollection<ViewList> MyList
{
get { return _MyList; }
set
{
if(value != null)
{
_MyList = value;
}
}
}
public MainWindowVM()
{
_MyList = new ObservableCollection<WpfDataGridTest.ViewList>();
_MyList.Add(new WpfDataGridTest.ViewList() { id = 1, code = "C101", description = "test1", isEnabled = true });
_MyList.Add(new WpfDataGridTest.ViewList() { id = 2, code = "C102", description = "test2", isEnabled = false });
_MyList.Add(new WpfDataGridTest.ViewList() { id = 3, code = "C103", description = "test3", isEnabled = true });
}
}
这是我的Window的XAML
<Window x:Class="WpfDataGridTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfDataGridTest"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525"
DataContext="{StaticResource MainWindowVM}">
<Grid>
<DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Margin="33,34,0,0" VerticalAlignment="Top" Height="236" Width="444"
CanUserAddRows="False" AlternationCount="2" AlternatingRowBackground="Blue" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding MyList}">
<DataGrid.Columns>
<DataGridTextColumn Header="View" Binding="{Binding id}" Width="2*" IsReadOnly="True" />
<DataGridTemplateColumn Header="Is Enabled" Width="Auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding isEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
<TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="44,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"
Text="{Binding Path=CurrentItem.description, ElementName=dataGrid}"/>
</Window>
此示例显示了使用VS 2015所预期的3行。您可以在此处看到:
注意:我将ViewModel的ViewList成员重命名为MyList,因为我不喜欢让某个成员成为同一个类的名称,因为它会让事情变得混乱。