2011-07-12 3 views
0

У меня есть TreeView привязаны к данным (модель MVVM), где я использую пользовательский элемент управления для отображения данных.Могу ли я получить User Control из TreeViewItem?

 <HierarchicalDataTemplate 
      DataType="{x:Type vm:SiteViewModel}" 
      ItemsSource="{Binding Children}"> 
      <StackPanel Orientation="Horizontal"> 
      <uc:MyUserControl x:Name="control1" Text="{Binding SiteName}" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 

Когда элемент выбран, мне нужен доступ к самому пользовательскому управлению.

Я нашел пример того, что делал что-то похожее на то, что я хочу, но он использовал TreeViewItem.Header. В моем коде из-за привязки TreeViewItem.Header является объектом SiteViewModel.

Есть ли простой способ извлечения фактического пользовательского элемента управления (типа MyUserControl) из самого TreeViewItem?

Спасибо.

+0

Зачем вам нужен доступ к управлению? Почему вы не можете получить доступ к модели представления элемента управления и внести в нее изменения? –

+0

Мне нужен доступ к элементу управления, чтобы установить на нем свойство. Пользовательский элемент управления будет переключаться между отображением TextBlock и TextBox, чтобы я мог редактировать «на месте» в TreeView. В любом случае, это план, но я начинаю думать, что это может быть немного продвинуто для меня! Может быть, есть лучший способ добиться этого. –

+0

Да, посмотрите в MVVM. Это позволит вам манипулировать моделью, а не самим представлением. Представление будет реагировать на изменения в модели посредством привязки/триггеров данных. –

ответ

0

Как я понимаю, вы должны указать Command, который будет извлекать или изменять какой-либо параметр. в вашем xaml, будет Binding на имущество, которое вы хотите изменить, может быть с конвертером или без него. Такой способ MVVM нравится. Если вы хотите изменить видимость между двумя элементами управления, так как в вашем случае это TextBox и TextBlock, вы должны создать переменную Visibility в вашей модели View, которая будет представлять ее видимость и привязать ее к TextBox или TextBlok. ваш XAML будет содержать следующие строки:

<Window.Resources> 
    <local:ReverseVisibilityConverter /> 
</Window.Resources> 
.... 
<TextBox Name="MyTB" Visibility="{Binding tbVisibility}" /> 
<TextBlock Visibility="{Binding ElementName=MyTB, Path=Visibility, Converter={StaticResources ReverseVisibilityConverter }}" /> 




public sealed class ReverseVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     try 
     { 
      var flag = (Visibility)value; 
      if (flag == Visibility.Visible) 
       return Visibility.Collapsed; 
      else 
       return Visibility.Visible; 
     } 
     catch 
     { 
      return Visibility.Visible; 
     } 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     try 
     { 
      if (((Visibility)value) == Visibility.Visible) 
       return Visibility.Collapsed; 
      else 
       return Visibility.Visible; 
     } 
     catch 
     { 
      return Visibility.Visible; 
     } 
    } 
} 

где local является пространство имен, где ваши Converter определены и. Вы указываете, что tbVisibility - это переменная, которая существует в Ancestor DataContext. Дайте мне больше информации, чтобы помочь вам, если это не ясно.

+0

Большое спасибо. Теперь я работаю, получая пользовательский элемент управления с помощью VisualTreeHelper (спасибо Kent), но я могу вернуться к этому, чтобы в какой-то момент получить более аккуратное решение. –

+0

Я также пробовал этот подход, так как, как и в предыдущей реализации пользовательского элемента управления, когда я добавил новый элемент в TreeView, я не смог получить доступ ни к новому TreeViewItem, ни к пользовательскому элементу управления, чтобы установить его в 'edit ' Режим. С этой версией он работает немного лучше в этом отношении, но я бы хотел выделить весь текст и установить фокус на TextBox после добавления нового элемента. Мое исследование этого до сих пор только показало мне, что это может быть довольно сложно. Есть ли простой способ сделать это? –

+0

метод easeist, но не 'MVVM' like, предназначен для обработки события' SelectedItemChanged'. [MSDN] (http://msdn.microsoft.com/en-us/library/ms595700.aspx) говорит, что 'OnItemsChanged' является' protected'. Если вы хотите получить к нему доступ, вам нужно получить свой 'OwnTreeView' из wpf' TreeView'. [Здесь] (http://www.codeproject.com/KB/WPF/AttachedBehaviors.aspx) - хорошая статья о поведении и TreeView. – stukselbax