Несколько элементов управления, привязанных (двухсторонних) к одному и тому же полю в Silverlight 4 - PullRequest
0 голосов
/ 12 января 2011

У меня проблема с несколькими элементами управления, привязанными к одному полю.Позвольте мне объяснить на простом примере:

У меня есть экземпляр этого класса в моем текстовом тексте:

class X { string myVar; }

myVar является составной переменной, например, содержит такие вещи, как "42; bar"У меня есть два TextBox, привязанных к myVar в моем Silverlight:

<TextBox Text="{Binding myVar, Mode=TwoWay, Converter=XConverter}" /><!-- 42 -->
<TextBox Text="{Binding myVar, Mode=TwoWay, Converter=YConverter}" /><!-- bar -->

XConverter знает, как конвертировать myVar в 42. YConverter знает, как конвертировать myVar в бар.

Но как я могу ConvertBack?Например, если я изменяю 42 на 43, как я могу восстановить 43; бар?Потому что в конвертере у меня нет предыдущего значения myVar.

И я не хочу добавлять свойства в класс X (в этом примере у меня есть 2 элемента управления, привязанных к полю, нона самом деле это намного больше).

Спасибо!

edit: И я не хочу добавлять обработчики, такие как TextChanged, я бы хотел сделать это "Binding way".

Ответы [ 2 ]

1 голос
/ 12 января 2011

Я бы сделал мультисвязывание http://www.scottlogic.co.uk/blog/colin/2010/05/silverlight-multibinding-solution-for-silverlight-4/ для XConverter и YConverter (с заполненным методом ConvertBack).

Я бы назначил каждый XConverter и YConverter для обоих текстовых полей. Тогда в XConverter замените только перед; и YConverter заменить после;

0 голосов
/ 13 января 2011

Я бы, вероятно, использовал бы класс декоратора для класса X.

Внутри класс декоратора разделил бы myVar на отдельные свойства, каждое из которых может быть связано с экраном.Тогда у вас будет метод ToX () для возврата объекта X из декоратора.Этот метод может легко создать свойство myVar.Пример выглядит примерно так:

public class X
{
  public string myVar { get; set; }
}

public class XDecorator
{ 
  public XDecorator(X x)
  {
    var pieces = x.Split(';');
    XPart = pieces[0];
    YPart = pieces[1];
  }


  public string XPart { get; set; }
  public string YPart { get; set; }

  public X ToX()
  {
    return new X { myVar = string.Format("{0};{1}", XPart, YPart) };
  }
}

Затем, когда вы устанавливаете это свойство в ViewModel, вы сначала оборачиваете его в этот класс декоратора.И когда вы собираетесь сохранить его, вы вызываете метод ToX (), чтобы получить объект X - то, что вам действительно нужно.Надеюсь, что это имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...