gpt4 book ai didi

c# - WPF MVVM 创建多个数据网格并将项目绑定(bind)到它们

转载 作者:行者123 更新时间:2023-12-03 10:33:23 25 4
gpt4 key购买 nike

我在 WPF 绑定(bind)中遇到了以下问题。
我需要从XML文件加载对象,并在列表框中以及选择ListBox项目中创建已加载项目的列表,然后显示合适的对象集。

我可以以“代码隐藏”的方式来做,但我真的想以正确的 MVVM 方式来做。
我的 Matrixes 类由 xsd2code 生成,其中包含:

List<CorrectionMatrixType> correctionMatrixField;

并跟随
 public partial class CorrectionMatrixType {   
public MatrixType A {get; set;}
public MatrixType B {get; set;}
public MatrixType C {get; set;}
... }

如何通过 Viewmodel 使用三个 DataGrid 创建“动态”类似于 Grid 的东西,并将每个矩阵(A、B、C)绑定(bind)到它们,哪些内容将根据列表框中选择的值而改变?我知道要将我的 MatrixType 绑定(bind)到 DataGrid,我必须使用 ValueConverter 将我的对象转换为二维数组。

也许我不得不承认我正在使用 MVVM Light。

请问,有什么建议吗?

最佳答案

我会使用 INotifyPropertyChanged 接口(interface)。这是一个小例子(不完全是你的情况,但足以说明原理,我认为):

矩阵类型类:

public class MatrixType
{
public string Name { get; set; }

public string Width { get; set; }

public string Height { get; set; }

}

xml:
 <Window.DataContext>
<local:MainViewModel />
</Window.DataContext>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<ListBox Grid.Column="0" ItemsSource="{Binding Items}" DisplayMemberPath="Name" SelectedItem="{Binding SelectedItem}"></ListBox>
<Grid Grid.Column="1">
<StackPanel Orientation="Vertical">
<TextBox Text="{Binding SelectedItem.Name}" Height="30"/>
<TextBox Text="{Binding SelectedItem.Height}" Height="30"/>
<TextBox Text="{Binding SelectedItem.Width}" Height="30"/>
</StackPanel>
</Grid>
</Grid>

MainViewModel.cs:
public class MainViewModel : INotifyPropertyChanged
{
public MainViewModel()
{
var list = new List<MatrixType>
{
new MatrixType {Height = "233", Name = "A", Width = "133"},
new MatrixType {Height = "333", Name = "B", Width = "233"},
new MatrixType {Height = "433", Name = "C", Width = "333"}
};
Items = new ObservableCollection<MatrixType>(list);
}

private MatrixType _selectedItem;
public MatrixType SelectedItem
{
get => _selectedItem;
set { _selectedItem = value; OnPropertyChanged(); }
}

public ObservableCollection<MatrixType> Items { get; set; }

public event PropertyChangedEventHandler PropertyChanged;

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}

MainViewModel.cs(使用 MVVM Light 时):
public class MainViewModel : ObservableObject
{
public MainViewModel()
{
var list = new List<MatrixType>
{
new MatrixType {Height = "233", Name = "A", Width = "133"},
new MatrixType {Height = "333", Name = "B", Width = "233"},
new MatrixType {Height = "433", Name = "C", Width = "333"}
};
Items = new ObservableCollection<MatrixType>(list);
}

private MatrixType _selectedItem;
public MatrixType SelectedItem
{
get => _selectedItem;
set { _selectedItem = value; RaisePropertyChanged(); }
}

public ObservableCollection<MatrixType> Items { get; set; }
}

关于c# - WPF MVVM 创建多个数据网格并将项目绑定(bind)到它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45278206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com