1

TabControl.ContentTemplate 内に保持されている UserControl の DependencyProperty に、タブコントロールの itemsource として設定されたディクショナリから値をバインドしようとしています。

私の人生では、それをバインドすることはできません。このインスタンスではビューモデルである userControl 'EnvironmentStateView' の DataContext と関係があるのではないかと強く感じています。

別の TextBlock では、辞書キーへのバインディングはコレクション内の各アイテムに対して機能しますが、残念ながらそれだけです。

EnvironmentCollectionView.xaml

<TabControl Name="EnvironmentCollectionTabControl" ItemsSource="{Binding environmentCollection}">
      <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Key}"></TextBlock>
            </DataTemplate>
      </TabControl.ItemTemplate>
      <TabControl.ContentTemplate>
          <DataTemplate>
                <local:EnvironmentStateView Grid.Column="0" Grid.Row="0" EnvironmentObject="{Binding Value}" EnvironmentKey="{Binding Key}"></local:EnvironmentStateView>
          </DataTemplate>
      </TabControl.ContentTemplate>
</TabControl>

EnvironmentStateView.xaml

/// <summary>
/// Interaction logic for EnvironmentStateView.xaml
/// </summary>
[Export(typeof(EnvironmentStateView))]
public partial class EnvironmentStateView : UserControl
{
    /// <summary>
    /// Environment object dependency property
    /// </summary>
    public static readonly DependencyProperty EnvironmentObjectProperty =
        DependencyProperty.Register(
            "EnvironmentObject",
            typeof(Framework.Environment),
            typeof(EnvironmentStateView),
            new PropertyMetadata(null));

    /// <summary>
    /// Environment key dependency property
    /// </summary>
    public static readonly DependencyProperty EnvironmentKeyProperty =
        DependencyProperty.Register(
            "EnvironmentKey",
            typeof(string),
            typeof(EnvironmentStateView),
            new PropertyMetadata(null));

    [ImportingConstructor]
    public EnvironmentStateView()
    {
        // Set data context
        this.DataContext = new EnvironmentStateViewModel();
        // Initialise
        InitializeComponent();
    }
    /// <summary>
    /// Gets or sets the environment object
    /// </summary>
    public Framework.Environment EnvironmentObject
    {
        get { return (Framework.Environment)GetValue(EnvironmentObjectProperty); }
        set { SetValue(EnvironmentObjectProperty, value); }
    }
    /// <summary>
    /// Gets or sets the environment key
    /// </summary>
    public string EnvironmentKey
    {
        get { return (string)GetValue(EnvironmentObjectProperty); }
        set { SetValue(EnvironmentObjectProperty, value); }
    }
}

environmentstateview の DataContext はビュー モデルに設定されていますが、これを削除すると datacontext が null になるため、そもそも何も継承されていないと思います。

私の目標は、environmentCollectionView がそのビューモデルで environmentCollection Observable ディクショナリを使用し、それを itemsource として tabctronol にバインドし、コレクション内の個々の環境オブジェクトを渡して、ユーザー コントロールを分離し、環境オブジェクト自体に関連付けられた特定のビュー/ビジュアルを処理することでした。 .

私がこれを行うことができると思った唯一の方法は、ディクショナリの値を依存関係プロパティとして渡すことでした。これにより、各ユーザーコントロールがそのことを実行できるようになります:)

どんな助けでも大歓迎です

よろしくウルフ

EDIT* UserControl を EnvironmentStateView に変更しました

EDIT *前のエラーを修正した直後に、バインディングエラー情報がさらに表示されることに気づきました

System.Windows.Data Error: 40 : BindingExpression path error: 'Key' property not found on 'object' ''EnvironmentStateViewModel' (HashCode=63276897)'. BindingExpression:Path=Key; DataItem='EnvironmentStateViewModel' (HashCode=63276897); target element is 'EnvironmentStateView' (Name=''); target property is 'EnvironmentKey' (type 'String')

System.Windows.Data Error: 40 : BindingExpression path error: 'Value' property not found on 'object' ''EnvironmentStateViewModel' (HashCode=32159097)'. BindingExpression:Path=Value; DataItem='EnvironmentStateViewModel' (HashCode=32159097); target element is 'EnvironmentStateView' (Name=''); target property is 'EnvironmentObject' (type 'Environment')

現在、キーと値は明らかに現在のデータ コンテキストである EnvironmentStateViewModel にありません。

EnvironmentTagTextBlock バインディングの Keyy へのスペルを意図的に間違えたため、バインディング エラーが発生しました。

System.Windows.Data Error: 40 : BindingExpression path error: 'Keyy' property not found on 'object' ''KeyValuePair`2' (HashCode=-459631492)'. BindingExpression:Path=Keyy; DataItem='KeyValuePair`2' (HashCode=-459631492); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

だから私の推測では、おそらく DataItem を EnvironmentStateViewModel から KeyValuePair`2 に何らかの方法で変更する必要があると思いますが、どうすればいいのか、またはおそらく笑う必要があるのか​​ わかりません。

4

1 に答える 1

0
public static readonly DependencyProperty EnvironmentObjectProperty =
    DependencyProperty.Register(
        "EnvironmentObject",
        typeof(Framework.Environment),
        typeof(EnvironmentStateView),
        new PropertyMetadata(null));

EnvironmentStateView親クラスは代わりにすべきではありませんUserControlか?

于 2012-08-19T08:26:38.033 に答える