在wpf中绑定一个二维bool数组到数据网格
本文关键字:网格 bool 二维 数组 数据 数据网 一个 wpf 绑定 | 更新日期: 2023-09-27 18:16:27
我必须使用2D Array创建一个像bool类型的数据网格的矩阵。我有一组布尔字符串,需要对数据网格中的每个单元格进行评估,如下所示
用于例如
cell[0,0] = ((server1 || server 2) &&服务器3)
cell[0,1] = ((server1 &&服务器3)&&服务器4)
cell[1,0] = ((server3 &&服务器2)||服务器4)
服务器N的值是Running或Stopped,它是从数据库中获取的。
如何创建一个2D矩阵数据网格,以及如何评估布尔字符串,使每个数据网格单元格的最终结果为TRUE或FALSE。
我看了一下这个链接二维数组的字符串,并以此为例,但我不知道我应该在哪里调用这些评估字符串。我是否必须将它们存储在XML文件中,然后调用它们,或者有其他方法调用它们。
我已经试过了:
public MatrixPage()
{
InitializeComponent();
bool[,] matrixcell = new bool[10, 22];
matrixcell[0, 0] = // should I place the Evaluation string here;
matrixcell[0, 1] = ;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 22; j++)
{
matrixcell[i, j] = // or Should I call here the evaluation boolean string for each iteration respective to the row/column from a file like XML or a any other file ??
}
}
var datsource = (from i in Enumerable.Range(0, matrixcell.GetLength(0))
select new clsdatasource(matrixcell[i, 0], matrixcell[i, 1], matrixcell[i,3])).ToList();
this.dg1.ItemsSource = datsource;
}
public class clsdatasource
{
public bool str1 { get; set; }
public bool str2 { get; set; }
public bool str3 { get; set; }
public clsdatasource(bool s1, bool s2,bool s3)
{
this.str1 = s1;
this.str2 = s2;
this.str3 = s3;
}
}
XAML
<Grid>
<DataGrid x:Name="dg1" CanUserAddRows="False" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="System1" Binding="{Binding str1}"/>
<DataGridTextColumn Header="System2" Binding="{Binding str2}"/>
<DataGridTextColumn Header="System3" Binding="{Binding str3}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
请帮助. .如有不明白的问题请指教,我会尽量解释得更清楚
你的类会像这样…
public class Clsdatasource
{
public bool Str1 { get; set; }
public bool Str2 { get; set; }
public bool Str3 { get; set; }
public Clsdatasource(){}
public Clsdatasource(bool s1, bool s2, bool s3)
{
Str1 = s1;
Str2 = s2;
Str3 = s3;
}
}
你的集合应该是这样的…
public class ClsdataSourceCollection : ObservableCollection<Clsdatasource>
{
private const string FileName = "MyData.xml";
private readonly XmlSerializer _serializer = new XmlSerializer(typeof(List<Clsdatasource>));
public void LoadData(Action onCompleted)
{
using (StreamReader sr = new StreamReader(FileName))
{
var s = _serializer.Deserialize(sr) as List<Clsdatasource>;
if (s != null)
{
Clear();
s.ForEach(Add);
}
}
onCompleted();
}
public void SaveData(Action onCompleted)
{
using (StreamWriter sw = new StreamWriter(FileName))
{
List<Clsdatasource> tosave = new List<Clsdatasource>();
tosave.AddRange(this);
_serializer.Serialize(sw, tosave);
}
onCompleted();
}
}
你可以看到这段代码是怎么回事…
private static void TestSaving()
{
ClsdataSourceCollection collection = new ClsdataSourceCollection();
for (int i = 0; i < 100; i++)
{
collection.Add(new Clsdatasource(true, true, true));
}
collection.SaveData(()=> Console.WriteLine("Saved"));
}
private static void TestLoading()
{
ClsdataSourceCollection collection = new ClsdataSourceCollection();
collection.LoadData(() => Console.WriteLine("Loaded"));
}
这两个方法只做创建、保存和加载。该工件是应用程序根目录中名为MyData.xml的XML文件。你需要在所有的极端情况、错误检测和竞赛中编写代码。
整个过程的最后一步是设置this.dg1。ItemsSource = collection;
请记住,如果您想实时更新您的网格,Clsdatasource类必须从INotifyPropertyChanged继承,这是一个完全不同的问题。
这应该可以让您开始序列化。它从。net 3左右就"开箱即用"了....