Привязать свойство самодельного пользовательского элемента управления к свойству модели основного вида - PullRequest
0 голосов
/ 29 июня 2011

У меня есть приложение wpf, в котором я расширил RichTextBox, чтобы обеспечить некоторые специфические функции.Давайте вызовем этот новый класс BetterTextBox.

Теперь, когда я нажимаю в этом TextBox, вызывается TextBox.OnPreviewMouseLeftButtonUp, и я получаю CaretPosition:

    protected override void OnPreviewMouseLeftButtonUp(MouseButtonEventArgs e)
    {
        PressedOffset = Document.ContentStart.GetOffsetToPosition(CaretPosition);      
    }

    public static readonly DependencyProperty PressedOffsetProperty 
          = DependencyProperty.Register("PressedOffset", typeof(int),
            typeof(ByteViewTextBox),
            new FrameworkPropertyMetadata()
        {
            DefaultValue = 0,
            BindsTwoWayByDefault = true,
            DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
        });

    public int PressedOffset
    {
        get { return (int)GetValue(PressedOffsetProperty); }
        set { SetValue(PressedOffsetProperty, value); Console.WriteLine("klöjgf");}
    }

XAML:

<Window x:Name="MainWindow">
    <BetterTextBox />
</Window>

MainWindow имеет MainViewModel в качестве DataContext.Я хочу, чтобы при щелчке мышью в BetterTextBox вызывалась функция в MainViewModel.Как я могу выйти из моего UserControl вызова функции в MainViewModel?

Я пробовал что-то вроде этого:

<Window x:Name="MainWindow">
   <BetterTextBox PressedOffset="{Binding ElementName=MainWindow, Path=MyFunction"/>
</Window>

MainViewModel:

public int MyFunction
{
     set { callMyRealFunction(); }
}

Но этоне работаетЕсть также способ зарегистрировать CallbackFunction для PressedOffsetProperty, но я не уверен, как зарегистрировать там функцию из MainViewModel, которая не является статичной.

Ответы [ 2 ]

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

Только что было решено, выполнив

<BetterTextBox PressedOffset="{Binding Path=Parent.DataContext.SelectFromOffset,
      RelativeSource={RelativeSource Self}}"/>

из Взаимодействие пользователя WPF с родительским представлением / моделью представления

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

Создайте еще одно свойство зависимости типа ICommand, скажем, «TextClickCommand».Создайте команду в вашей модели представления и привяжите ее к TextClickCommand и выполните ее на MouseClick.

Редактировать: Вы можете сделать это даже наоборот, создав свойство зависимости IsoliteSollected bool в привязке текстового поля к этому bool, используя правильное представлениемодель и вызовите ваш метод в установщике свойств модели представления.

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