2011-07-12 14 views
0

私は、データ表示にユーザーコントロールを使用しているデータ(MVVMモデル)にバインドされたTreeViewを持っています。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のようなものです。 2つのコントロール間の可視性を変更する場合は、TextBoxとTextBlockのように、可視性を表すView-Modelに変数Visibilityを作成し、その値をTextBoxまたはTextBlokにバインドする必要があります。

local
<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; 
     } 
    } 
} 

は、あなたのConverterを定義し、名前空間である:あなたのXAMLは、次の行が含まれています。あなたはtbVisibility - が変数であり、それがAncestor DataContextに存在することを示しています。それがはっきりしない場合は、私にあなたを助けるために、より多くの情報を与えてください。

+0

ありがとうございました。 VisualTreeHelper(Kentに感謝します)を使用してユーザーコントロールを取得することで現在作業していますが、これを再訪していつか解決策を得ることができます。 –

+0

これまでの「ユーザーコントロール」の実装と同様に、TreeViewに新しい項目を追加したときに、新しいTreeViewItemやユーザーコントロール自体にアクセスできないため、この方法を試してみました。モード。このバージョンでは、その点では少し良く機能しますが、新しい項目が追加されると、すべてのテキストを選択してTextBoxにフォーカスを設定したいと思います。これまでの私の研究は、それがかなり難しいかもしれないことを私に示してくれました。これを行う簡単な方法はありますか? –

+0

easeistメソッドは 'MVVM'と似ていませんが、' SelectedItemChanged'イベントを処理する方法です。 [MSDN](http://msdn.microsoft.com/en-us/library/ms595700.aspx)によれば、OnItemsChangedは保護されています。それにアクセスしたい場合は、 'TreeView' wpfから' OwnTreeView'を派生させる必要があります。 [Here](http://www.codeproject.com/KB/WPF/AttachedBehaviors.aspx)は、Behaviors&TreeViewに関する優れた記事です。 – stukselbax

関連する問題