Доступ к ViewModel для управления родственными элементами

Я знаю, что есть несколько похожих тем, но я все еще не уверен в лучшей реализации.

Код должен быть понятен сам по себе — проверьте комментарий там. Как лучше всего получить доступ к этому VIewModel.

часть: FontSearchBox — это UserControl без ViewModel — он просто содержит TextBox для поиска, который должен выполнить команду.

Спасибо и ценю.

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="35" />
        <RowDefinition Height="90" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <part:MainWindowControls Grid.Row="0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" />

    <Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="200" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Image Source="/Typesee;component/Resources/window_logo.png" Width="156" Height="45" Grid.Column="0" VerticalAlignment="Top" RenderOptions.BitmapScalingMode="NearestNeighbor" />

        <!-- THIS TEXTBOX NEEDS TO CALL A COMMAND (SearchCommand.Execute(string)) Which resides in the fontTreeViewControl's ViewModel (FontTreeViewModel) -->
        <part:FontSearchBox Grid.Column="1" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0,0,12,10" Width="250" DataContext="{Binding ElementName=fontTreeViewControl, Path=DataContext}" />
    </Grid>

    <vw:FontTreeView x:Name="fontTreeViewControl" Grid.Row="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" />

</Grid>

person Dominic    schedule 24.11.2011    source источник
comment
Что вы подразумеваете под THIS TEXTBOX NEEDS TO CALL A COMMAND? Как текстовое поле сможет вызвать команду? Вы хотите связать какое-то свойство part:FontSearchBox с fontTreeViewControl's ViewModel?   -  person sll    schedule 25.11.2011
comment
В коде я хочу вызвать команду для такого события, как textchanged. Должен ли я создать AttachedProperty и привязать его к xaml?   -  person Dominic    schedule 25.11.2011


Ответы (1)


если вы используете MVVMLight, вы можете использовать Event to Command для ....

в вашем UserControl <vw:FontTreeView /> у вас должен быть TextBox, поэтому в TextBox Xaml вам нужно написать

Xaml

<i:Interaction.Triggers>
    <i:EventTrigger EventName="TextChanged">
        <Commands:EventToCommand Command="{Binding Path=TextChangedCommand}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>

Чтобы узнать больше об псевдонимах, см. эту ссылку. . он также демонстрирует, как передать аргумент события в вашу ViewModel.... но вы можете этого не знать, поэтому можете его пропустить...

Если TextBox находится за пределами fontTreeViewControl.... тогда,

<StackPanel DataContext={Binding Path=DataContext,ElementName=fontTreeViewControl}>
    <TextBox >
    <i:Interaction.Triggers>
    <i:EventTrigger EventName="TextChanged">
        <Commands:EventToCommand Command="{Binding Path=TextChangedCommand}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>
    </TextBox>
</StackPanel>

Это может вам помочь.... :)

person Ankesh    schedule 25.11.2011
comment
Спасибо, к сожалению, текстовое поле находится за пределами элемента управления fontreeview, но команда и функциональность находятся внутри него. Вы рекомендуете MVVMLight? Планировал использовать его для моего следующего проекта. - person Dominic; 30.11.2011
comment
@infensus да ... он действительно хорош и прост в использовании ... что касается вашей проблемы ... см. отредактированный ответ - person Ankesh; 01.12.2011