这不是Calibro,但你说没问题。
我删除了sessionmins和sessionamout属性以缩短答案,您可以像添加其他属性一样添加它。
首先,我将inotifypropertychanged添加到模型中,还为属性(大写)创建pascalcase。帕斯卡酶是不需要的,但它是最常见的约定。
public class PackageModel : INotifyPropertyChanged
{
private int _Id;
public int Id
{
get { return _Id; }
set
{
if (value != _Id)
{
_Id = value;
NotifyPropertyChanged();
}
}
}
private string _SessionName;
public string SessionName
{
get { return _SessionName; }
set
{
if (value != _SessionName)
{
_SessionName = value;
NotifyPropertyChanged();
}
}
}
private bool _IsActive;
public bool IsActive
{
get { return _IsActive; }
set
{
if (value != _IsActive)
{
_IsActive = value;
NotifyPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
我将vm修改为只有包列表和selectedpackage,从名称包中删除列表并使其成为复数外接程序。还可以创建一些默认的构造函数来填充开发人员列表。正如您所建议的,现在不需要额外的属性,稍后只需使用selectedpackage。
public class MainViewModel : INotifyPropertyChanged
{
public MainViewModel()
{
Packages = new List<PackageModel>()
{
new PackageModel()
{
Id = 1, SessionName="Session1", IsActive = true
},
new PackageModel()
{
Id = 2, SessionName="Session2", IsActive = false
}
};
}
private PackageModel _SelectedPackage;
public PackageModel SelectedPackage
{
get { return _SelectedPackage; }
set
{
if (value != _SelectedPackage)
{
_SelectedPackage = value;
NotifyPropertyChanged();
}
}
}
private List<PackageModel> _Packages;
public List<PackageModel> Packages
{
get { return _Packages; }
set
{
if (value != _Packages)
{
_Packages = value;
NotifyPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
并添加视图。进行手动绑定。当您更改网格中的项目时,文本框和复选框将自动更新,如果您更改文本框或复选框中的值,它也将更新数据报。
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<TextBox Width="210" Margin="5 5" HorizontalAlignment="Left" Grid.Row="0" Grid.Column="0" Text="{Binding SelectedPackage.SessionName, Mode=TwoWay}"/>
<StackPanel Grid.Row="1">
<CheckBox Margin="5 5" Content="Is Active?" IsChecked="{Binding SelectedPackage.IsActive, Mode=TwoWay}"/>
</StackPanel>
<DataGrid ItemsSource="{Binding Packages,Mode=TwoWay,NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged }"
SelectedItem="{Binding SelectedPackage, Mode=TwoWay}"
Grid.Row="2"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserSortColumns="False"
CanUserReorderColumns="False"
CanUserResizeRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding Id}" Visibility="Hidden" IsReadOnly="True"/>
<DataGridTextColumn Header="Name" Binding="{Binding SessionName}" Width="120" IsReadOnly="True"/>
<DataGridCheckBoxColumn IsReadOnly="True" Header="Is Active?" Binding="{Binding IsActive}" Width="*"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
如果解决方案对您有效,请通知我!