Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Показ неявно ссылаемого объекта в SL\WPF


Автор: jonie 15.12.2009, 20:22
Пусть существует два DTO:
Код

class A{
 public int bRefId;
// public other data...
}
class B {
 public int Id;
}

Как в разметке я могу (или не могу?) используя Binding и имея DataContext равным ссылкой на экземпляр А, вывести данные класса B.

Я придумал только вариант использования TypeConverter-а в виде 
Код

<someelement Text="{Binding bRefId, Converter={StaticResource EnumConverter}}" />
но в этом случае, для доступа ко многим свойствам B придется писать много конверторов....

Автор: tol05 15.12.2009, 23:11
А где здесь хоть какая-нибудь связь между классами A и B?
И где здесь DTO?

Автор: jonie 15.12.2009, 23:17
A и B DTO-шные классы. Разве нет?

ссылка "неявная" (если так можно назвать) по полю bRefId (я думаю это понятно) (Связь 1-1 классическая).
в TypeConverter-е я могу сделать нечто вроде : ctx.B.Where(x=>x.Id == value).First();

Дело в том что такая надобность возникла в ходе работы с EF-ком, который очень не любит циклические ссылки, а подобные DTO классы генерирует WCF RIA Services.

Автор: tol05 16.12.2009, 00:49
Цитата(jonie @  15.12.2009,  22:17 Найти цитируемый пост)
A и B DTO-шные классы. Разве нет?

после того, как был упомянут LINQ - возможно да ). Но до того.. какой-то класс с единственным полем - и догадаться, что это EF DTO... не смог

Одним словом...у меня получилось "сплясать" так
Код

public class A
    {
        public string Text { get; set; }
        public B B { get; set; }
    }

    public class B
    {
        public string Name { get; set; }
        public string Description { get; set; }
    }
...
public Window1()
        {
            this.DataContext = new A { Text = "text", B = new B { Description = "desc", Name = "N1" } };
            
            InitializeComponent();
        }

Код

<TextBlock DataContext="{Binding Path=B}" Text="{Binding Path=Description}"/>

Автор: jonie 16.12.2009, 00:53
Цитата

после того, как был упомянут LINQ - возможно да ). Но до того.. какой-то класс с единственным полем - и догадаться, что это EF DTO... не смог
DTO никаким образом к EF  или LINQ не относился никогда.


tol05, хех, у тебя явная ссылка есть на B в классе А. Так все умеют (можно быо Path=B.Description прописать просто без смены контекста у элемента). У меня же ссылки нет, есть только ID объекта, и коллекция, из которой этот объект надо вытянуть (найти) по ID.

Автор: tol05 16.12.2009, 01:47
тогда не знаю )

даже если предположить, что можно использовать Notifications при изменении одного ID на другой (чтобы вытянуть новые данные по этому ID из коллекции)... Не вижу в этом выигрыша по сравнению с написанием конвертеров.
Кстати, конвертеры - часто предлагаемый аппроач, также...


Цитата(jonie @  15.12.2009,  23:53 Найти цитируемый пост)
DTO никаким образом к EF или LINQ не относился никогда.

отчего же? а при помощи чего LINQ данные переносит из источника?

Автор: jonie 16.12.2009, 23:45
вот такой придумал (наткнулся в одной либе) способ: сделать TypeConverter для Funct<object, object, object>
Код

        public class FuncValueConverter : IValueConverter
        {
            private readonly Func<object, object, object> convertFunc;

            public FuncValueConverter(Func<object, object, object> convertFunc)
            {
                this.convertFunc = convertFunc;
            }

            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return this.convertFunc(value, parameter);
            }

            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }

суть в том, что теперь можно делать нормальнй байдинг на функцию фактически.... т.о. не надо под каждый такой ID рисовать конвертер (хотя это спорный метод с т.з. понятности)...

Добавлено через 53 секунды
Цитата


Цитата


DTO никаким образом к EF или LINQ не относился никогда.


отчего же? а при помощи чего LINQ данные переносит из источника? 
DTO это паттерн программирования, LINQ это технология. Соленое со сладким в общем не надо мешать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)