Доступ к Datacontext и собственности в коде в то же время - PullRequest
0 голосов
/ 20 июля 2011

Я использую MVVM / WPF и пытаюсь сделать что-то, казалось бы, простое, но не могу найти чистого решения.

Я хочу сделать следующее:

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

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

<TextBox x:Name="textBox" Text="{Binding Model.MyProperty}">
 <TextBox.ToolTip>
        <MultiBinding Converter="{StaticResource brNewMultiConverter}">
                <!-- This to trigger the converter in all required cases. 
                     Without it, i cant get the event to fire when filling 
                     the model initially 
                 -->
                <Binding ElementName="textBox" Path="Text" />
                <!-- This has the properties i need, but wont fire without 
                     the binding above -->
                <Binding ElementName="textBox" />
        </MultiBinding>
 </TextBox.ToolTip>
</TextBox>

Я хотел бы сделать что-то повторно используемое и, возможно, для других элементов управления, поэтому я не просто использую событие textaged.

Если бы кто-нибудь мог указать мне правильное направление, это было бы очень ценно.

Ответы [ 2 ]

1 голос
/ 20 июля 2011

Хорошо, что касается вашего мультибиндинга, чего вы там пытаетесь достичь?Я не знаю, что должен делать ваш конвертер, но нельзя ли это сделать с помощью класса реализации IValueConverter?Я предполагаю, что нет, похоже, что вы передаете текстовое поле конвертеру.

Если у метода есть несколько вещей, когда обновляются свойства вашей модели, вы можете заставить модель представления подписаться на события в вашей модели.учебный класс.Просто объявите объект WithEvents (VB.NET) и добавьте обработчики событий для On [PropertyName] Изменено.

При реализации MVVM я склонен трактовать codebehind как гражданина второго класса.Я делаю все возможное, чтобы вытолкнуть всю логику из ViewModel или View, если я могу.Я почти полностью прекратил использовать конвертеры, так как большая часть этой логики может дублироваться во ViewModels, и если это то, что я хочу использовать повторно, у меня обычно просто есть небольшой вспомогательный класс, который получает то, что ему передают, что-то делает, ипередает его обратно.У меня никогда не было таких хороших отношений с IValueConverter ...

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

0 голосов
/ 20 июля 2011

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

<TextBox Text="{Binding Model.MyProperty}" ToolTip="{Binding Model.MyProperty}"/>

Если это не то, что вы хотите, но хотите, чтобы всплывающая подсказка изменялась в зависимости от значения текстового поля, то сделайте это в вашей модели представления, например,

public class MyViewModel
{
  string _MyProperty;
  public string MyProperty
  {
    get { return _MyProperty;}
    set 
    { 
       _MyProperty = value; 
       OnPropertyChanged("MyProperty");
       OnPropertyChanged("MyToolTipProperty"); //force WPF to get the value of MyToolTipProperty
    }
  }

  public string MyToolTipProperty
  {
    get 
    { 
      //return what you want
    }

  }
}

и затем в вашей разметке:

<TextBox Text="{Binding Model.MyProperty}" ToolTip="{Binding Model.MyToolTipProperty}"/>
...