Как обновить пользовательский элемент управления, когда событие происходит в другом пользовательском элементе управления? - PullRequest
1 голос
/ 24 сентября 2010

в моем окне у меня есть вид дерева и текстовый блок. древовидное представление привязано к модели представления. Узлы дерева связаны с другой моделью представления. модель представления дерева предоставляет список узлов дерева верхнего уровня, а модель представления для узлов дерева предоставляет список дочерних узлов. в моделях моего представления нет представления о выбранном в данный момент узле дерева.

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

мой вопрос, как это сделать правильно MVVM? Я бы предпочел сделать это в XAML. Должен ли я добавить свойство в модель дерева для текущего выбранного узла, а затем просто привязать текстовый блок к этому свойству? если да, то как мне сообщить модели представления дерева о том, что представление дерева изменило свой текущий узел?

или я могу сделать это по-другому? я не знаю как ...

РЕДАКТИРОВАТЬ: позвольте мне перефразировать вопрос: как установить для текста внутри текстового блока свойство Name модели представления, соответствующей выбранному элементу, когда свойство IsSelected модели представления становится истинным?

Ответы [ 2 ]

1 голос
/ 26 сентября 2010

Просто свяжите с SelectedItem самого элемента TreeView.

Вот довольно простой пример, использующий XmlDataProvider. DataTemplate на ContentPresenter - вот где происходит магия:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Page.Resources>
    <XmlDataProvider x:Key="Data" XPath="Tree">
      <x:XData>
        <Tree xmlns="" Text="Test">
          <Node Text="Weapon">
            <Node Text="Sword">
              <Node Text="Longsword"/>
              <Node Text="Falchion"/>
              <Node Text="Claymore"/>
            </Node>
            <Node Text="Polearm">
              <Node Text="Halberd"/>
              <Node Text="Pike"/>
            </Node>
          </Node>
          <Node Text="Armor">
            <Node Text="Cloth Armor"/>
            <Node Text="Leather Armor"/>
            <Node Text="Ring Mail"/>
            <Node Text="Plate Mail"/>
          </Node>
          <Node Text="Shield">
            <Node Text="Buckler"/>
            <Node Text="Tower Shield"/>
          </Node>
        </Tree>
      </x:XData>
    </XmlDataProvider>
    <HierarchicalDataTemplate x:Key="NodeTemplate" ItemsSource="{Binding XPath=Node}">
      <TextBlock Text="{Binding XPath=@Text}"/>
    </HierarchicalDataTemplate>
  </Page.Resources>
  <DockPanel>  
    <TreeView 
      x:Name="Objects" 
      ItemsSource="{Binding Source={StaticResource Data}, XPath=Node}"
      ItemTemplate="{StaticResource NodeTemplate}"/>
    <ContentPresenter Content="{Binding ElementName=Objects, Path=SelectedItem}">
      <ContentPresenter.ContentTemplate>
        <DataTemplate>
          <TextBlock Text="{Binding XPath=@Text}"/>
        </DataTemplate>
      </ContentPresenter.ContentTemplate>
    </ContentPresenter>
  </DockPanel>
</Page>
1 голос
/ 25 сентября 2010

Вы можете использовать MVVM Light Messaging, что позволяет легко обмениваться данными между моделями представления в отсоединенном виде.

Хороший пример: http://chriskoenig.net/2010/07/05/mvvm-light-messaging/

MVVM Light Toolkit можно загрузитьздесь: http://mvvmlight.codeplex.com/

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