Привязка двумерного массива bool к сетке данных в wpf

Мне нужно создать матрицу типа datagrid типа bool с использованием 2D-массива. У меня есть набор логических строк, которые необходимо оценивать для каждой ячейки в сетке данных следующим образом.

для например

ячейка [0,0] = ((сервер1 || сервер 2) && сервер 3)

ячейка [0,1] = ((сервер1 && сервер 3) && сервер 4)

ячейка [1,0] = ((сервер3 && сервер 2) || сервер 4)

значения для сервера N работают или остановлены, и они получены из базы данных.

как создать сетку данных 2D-матрицы и как оценить логическую строку, чтобы конечный результат был ИСТИНА или ЛОЖЬ для каждой ячейки сетки данных.

Я просмотрел эту ссылку 2D-массив для строки и взял это в качестве примера, но я не знаю, где я должен вызывать эти строки оценки. Должен ли я хранить их в файле 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>

Пожалуйста, помогите .. если вопрос не ясен для понимания, пожалуйста, прокомментируйте, я постараюсь объяснить более четко


person Indhi    schedule 03.06.2013    source источник
comment
Сетка должна быть статической? В противном случае он должен наследоваться от INotifyPropertyChanged. Bools будут оценивать их строковое представление во время презентации. Сам язык не допускает неявного преобразования логического значения в строку, но привязка сделает это автоматически. Какой аспект не работает?   -  person Gayot Fow    schedule 03.06.2013
comment
@GarryVass Нет, я хочу, чтобы сетка создавалась динамически. оценка логической строки здесь не проблема, я не знаю, где разместить эту логическую строку для каждой [ячейки] (я имею в виду, в каком формате файла я должен их поместить, чтобы я мог получить их во время итерации). и после их извлечения, как разместить их в соответствующей матричной ячейке   -  person Indhi    schedule 03.06.2013
comment
Хорошо, стало немного понятнее, спасибо. Если бы вам нужно было постоянное хранилище, я бы пошел по пути вашей догадки об XML. Вам понадобится конструктор без параметров для класса clsdatasource, и я бы десериализовал данные в ObservableCollection‹clsdatasource›. Но это основано исключительно на том, как я понимаю ваш вопрос сейчас.   -  person Gayot Fow    schedule 03.06.2013
comment
Спасибо за ответ, если возможно, не могли бы вы опубликовать простой пример, как это работает. это было бы действительно толчком для моего прогресса сейчас   -  person Indhi    schedule 03.06.2013
comment
Я могу поместить некоторый псевдокод, который сериализует и десериализует ваши данные, если это полезно. Я не знаю, что там насчет того, что серверы работают, а что нет...   -  person Gayot Fow    schedule 03.06.2013
comment
ок, конечно.. сойдет.. действительно спасибо   -  person Indhi    schedule 03.06.2013


Ответы (1)


Ваш класс хотел бы, чтобы это...

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"));
}

Эти два метода просто создают, сохраняют и загружают. Артефакт представляет собой файл XML в корневом каталоге приложения с именем MyData.xml. Вам нужно кодировать во всех крайних случаях и обнаружении ошибок и гонках.

Последний шаг во всей этой хитрости — установить this.dg1.ItemsSource = collection;

Помните, что если вы хотите обновлять свою сетку в реальном времени, класс Clsdatasource должен наследоваться от INotifyPropertyChanged, а это совсем другой вопрос.

Это должно помочь вам начать сериализацию. Он поставляется «из коробки», начиная с .NET 3 или около того....

person Gayot Fow    schedule 03.06.2013