Доступ к контексту данных и свойству в программном коде одновременно

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

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

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

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

<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>

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

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


person HockeyJ    schedule 19.07.2011    source источник
comment
используйте метод для выполнения других операций в пользовательском интерфейсе, связанных с привязкой свойства. если бы это было конкретно, можно было бы предложить способы достижения этого.   -  person    schedule 20.07.2011


Ответы (2)


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

<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}"/>
person Jose    schedule 20.07.2011
comment
Спасибо, Хосе (и @CodeWarrior), это оба удовлетворительных ответа, чтобы положить конец потерянным часам. Причина, по которой я пытался это сделать, заключалась в проверке в CSLA MVVM. Проверка проходила нормально при использовании DataAnnotations, но не при использовании правил проверки Csla. Я только что посмотрел последнюю версию, где проверка была обновлена ​​и теперь работает без каких-либо дополнительных усилий (lhotka.net/weblog/CSLA4BusinessRulesSubsystem.aspx). - person HockeyJ; 21.07.2011

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

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

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

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

person CodeWarrior    schedule 19.07.2011