Nano Hash - криптовалюты, майнинг, программирование

Привязки шаблонов с UnboundFields в XamDataGrid

все. У меня есть XamDataGrid объектов; у каждого объекта есть два свойства, которые я хочу редактировать в сетке. Я создаю свой FieldLayout программно, чтобы разрешить различное количество столбцов. Когда я определяю свой макет, я могу установить привязку для каждого поля, чтобы PropertyPath указывал на конкретный столбец в моей модели представления ((т.е. Path="Columns[0]", Path="Columns[1]" и т. д.). Это работает отлично:

http://imgur.com/rJLCKiR

Я хочу применить шаблон к CellValuePresenter, чтобы позволить мне редактировать каждое поле с одним текстовым полем, привязанным к каждому из двух полей:

http://imgur.com/9IEq1Du

Как видите, привязки шаблонов неверны. Прямо сейчас шаблон имеет привязку к одному из столбцов (Path="DataItem.Columns[0]"), так как я не могу найти простой способ получить индекс для каждого столбца в шаблоне. Я действительно хочу, чтобы CellValuePresenter получил правильный связанный объект, определенный в моем FieldLayout, но привязал каждое текстовое поле к соответствующему свойству.

Любая помощь будет принята с благодарностью. Спасибо, Эд

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           xmlns:igWPF="http://schemas.infragistics.com/xaml/wpf"
          xmlns:local="clr-namespace:WpfApplication2"
        Title="MainWindow" Height="350" Width="525">


    <Window.Resources>
        <ResourceDictionary>
            <local:InfoConverter x:Key="InfoConverter" />

            <Style TargetType="{x:Type igWPF:CellValuePresenter}" x:Key="InfoStyle">
                <Setter Property="BorderThickness" Value="2"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type igWPF:CellValuePresenter}">
                            <StackPanel>
                                <Border BorderBrush="Black" BorderThickness="2">
                                    <StackPanel>
                                        <StackPanel Orientation="Vertical">
                                            <Label Content="Name:" />
                                            <TextBox Text="{Binding Path=DataItem.Columns[0], ConverterParameter=name, Converter={StaticResource InfoConverter}}"/>
                                        </StackPanel>
                                        <StackPanel Orientation="Vertical">
                                            <Label Content="Age:" />
                                            <TextBox Text="{Binding Path=DataItem.Columns[0], ConverterParameter=age, Converter={StaticResource InfoConverter}}"/>
                                        </StackPanel>
                                    </StackPanel>                                        
                                </Border>                                    
                            </StackPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ResourceDictionary>
    </Window.Resources>

    <Grid>
        <igWPF:XamDataGrid x:Name="Grid"  DataSource="{Binding Rows, Mode=TwoWay}">
            <igWPF:XamDataGrid.FieldLayouts>
                <igWPF:FieldLayout>
                    <igWPF:FieldLayout.Fields>

                    </igWPF:FieldLayout.Fields>
                </igWPF:FieldLayout>
            </igWPF:XamDataGrid.FieldLayouts>
            <igWPF:XamDataGrid.FieldLayoutSettings>
                <igWPF:FieldLayoutSettings SelectionTypeCell="Single" SelectionTypeRecord="Single" AutoGenerateFields="False"/>
            </igWPF:XamDataGrid.FieldLayoutSettings>
        </igWPF:XamDataGrid>
    </Grid>
</Window>


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;

namespace WpfApplication2
{
    class InfoConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string mode = parameter as string;
            Info info = value as Info;
            if (mode != null && info != null)
            {
                if (mode.Equals("name"))
                {
                    return info.Name;
                }
                else if (mode.Equals("age"))
                {
                    return info.Age;
                }
            }            
            return null;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return null;
        }
    }
}

using Microsoft.Practices.Prism.ViewModel;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WpfApplication2
{
    public class RowViewModel :NotificationObject
    {
        public RowViewModel(params Info[] info) : base()
        {
            foreach (Info i in info){
                Columns.Add(i);   
            }
        }

        private ObservableCollection<Info> columns = new ObservableCollection<Info>();
        public ObservableCollection<Info> Columns
        {
            get
            {
                return columns;
            }
            set
            {
                columns = value;
                RaisePropertyChanged("Columns");
            }
        }
    }

      public class TableViewModel :NotificationObject
      {
        public TableViewModel() : base()
        {

            Rows.Add(new RowViewModel(new Info("A", 1), new Info( "B", 2), new Info("C", 3)));
            Rows.Add(new RowViewModel(new Info("D", 4), new Info( "E", 5), new Info("F", 6)));
            Rows.Add(new RowViewModel(new Info("G", 7), new Info("H", 8), new Info("I", 9)));
        }

        private ObservableCollection<RowViewModel> rows = new ObservableCollection<RowViewModel>();
        public ObservableCollection<RowViewModel> Rows
        {
            get
            {
                return rows;
            }
            set
            {
                rows = value;
                RaisePropertyChanged("Rows");
            }
        }
    }

      public class Info
      {
          public Info(string name, int age)
          {
              this.Name = name;
              this.Age = age;
          }

          public override string ToString()
          {
              return Name + " " + Age;
          }

          private string _name;
          public string Name
          {
              get
              {
                  return _name;
              }

              set
              {
                  _name = value;
              }
          }

          private int _age;
          public int Age
          {
              get
              {
                  return _age;
              }
              set
              {
                  this._age = value;
              }
          }
      }
}

Ответы:


1

Редактировать: Я понял это! Я просто привязываюсь к значению CellValuePresenter.

<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type igWPF:CellValuePresenter}}, Path=Value, ConverterParameter=name, Converter={StaticResource InfoConverter}}"/>

Черт, мне даже конвертер не нужен:

<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type igWPF:CellValuePresenter}}, Path=Value.Age}"/>
26.07.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..