Как мне привязать свойство к методу и передать параметры? - PullRequest
0 голосов
/ 28 июня 2011

У меня есть сетка с прямоугольником в каждой ячейке в xaml. Я знаю, что могу связать заливку каждого прямоугольника со свойством в моей ViewModel, но вместо этого я хочу связать заливку каждого прямоугольника с методом в ViewModel, передать координаты x и y прямоугольника и получить обратно заполнить (который может измениться во время выполнения).

Есть ли простой способ сделать это? Я не знаю, возможно ли это вообще, поскольку, когда метод изменяет заливку, возвращаемую для определенной координаты x и y, как представление узнает, что метод обновил это значение?

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

Ответы [ 3 ]

1 голос
/ 29 июня 2011

Это может не сработать в вашем сценарии, но вы можете вызвать метод из привязки, используя ObjectDataProvider.Вот краткий пример:

<Window.Resources>
  <local:StringToDoubleConverter x:Key="stringToDouble" />

  <local:MyObject x:Key="objInstance" />

  <ObjectDataProvider
    x:Key="odp"
    ObjectInstance="{StaticResource objInstance}"
    ObjectMethod="MyMethod"
    >
    <ObjectDataProvider.MethodParameters>
      <sys:Double>0</sys:Double>
    </ObjectDataProvider.MethodParameters>
  </ObjectDataProvider>
</Window.Resources>

Теперь элемент в вашем представлении, скажем, TextBox, может связываться с параметром метода:

<TextBox Text={Binding Source={StaticResource odp}, Path=MethodParameters[0], UpdateSourceTrigger=PropertyChanged, Converter={StaticResource stringToDouble}} />

Затем возвращаемое значение метода можно использовать впривязка в другом месте:

<Label Content="{Binding Source={StaticResource odp}}" ContentStringFormat="Method returned: {0}" />

Опять же, это может не сработать в вашем сценарии, но оно иллюстрирует способ передачи параметра в метод и полного использования возвращаемого значения в XAML.Вот ресурс для получения дополнительной информации: http://bea.stollnitz.com/blog/?p=22

0 голосов
/ 28 июня 2011

Привязка не может использоваться как способ вызова методов и передачи параметров.Это просто механизм для синхронизации состояния между вашим видом и моделью представления.

В вашем случае модель представления должна знать координаты вашего прямоугольника, чтобы определить заливку.Следовательно, для каждого прямоугольника вашей модели представления необходимо предоставить X, Y, Fill свойства.

Большая проблема здесь заключается в том, как обеспечить модель представления координатами X & Y?Я предполагаю, что эти прямоугольники находятся в каком-то контейнере, который определяет их местоположение?Если так, то единственная техника, о которой я могу подумать, - это создать прикрепленное поведение для UIElement, который вычисляет свою позицию с помощью TransformToVisual.См. Например:

http://forums.silverlight.net/forums/p/12160/414862.aspx

Это может быть привязано к вашим значениям X & Y в модели представления.

Однако, если честно, если вы боретесьчтобы заставить MVVM работать здесь, возможно, это неправильный шаблон?

Если вы просто создаете пользовательский интерфейс, который состоит из цветных прямоугольников, я бы просто сделал это в цикле, добавив прямоугольники и раскрасив их в коде.позади!

ПОЦЕЛУЙ (Держи это просто, глупый!)

0 голосов
/ 28 июня 2011

Вы можете попробовать использовать IValueConverter для этого:

[ValueConversion(typeof (MyCoordObject), typeof (Brush))]
public class CoordToBrushConverter : ConverterExtension
{
   public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var coordObject= (MyCoordObject) value;

        if (coordObject.X == 132) return Brushes.Red; 
        //define your own brushes as StaticResource or something, this won't work
        return Brushes.Black;
    }


    public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        //nothing
        return value;
    }
}

Теперь вам просто нужно выяснить, какой объект вы хотите передать конвертеру. Используйте это в своем XAML следующим образом:

<my:CoordToBrushConverter x:key="myConverter"/>
<TextBox BackgroundBrush={Binding myObj, Converter={StaticResource myConverter}} />

Если у вас нет объекта, который содержит координаты, возможно, вы можете использовать MultiValueConverter и передавать координаты одна за другой из элемента управления? Вы должны поиграть с этим, чтобы заставить его работать.

Если вы не хотите использовать конвертеры, вы всегда можете проверить некоторые из инфраструктур MVVM, если я не ошибаюсь, некоторые из них поддерживают привязку к методам.
Проверьте Caliburn или MVVMLight

НТН

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