代码之家  ›  专栏  ›  技术社区  ›  Oliver Hanappi

是否可以将WPF控件绑定到多个数据上下文?

  •  2
  • Oliver Hanappi  · 技术社区  · 15 年前

    我编写了一个UserControl,它的DataContext包含一个集合和一个bool属性。集合正在数据网格中显示(并编辑),该网格具有自定义列模板。列中控件的DataContext当然是UserControl的DataContext集合的项。但是,我需要将列中控件的一个属性绑定到UserControl的DataContext的bool属性,而不是绑定到集合项。

    你对如何解决这个问题有什么想法吗?

    祝你好运,奥利弗

    2 回复  |  直到 15 年前
        1
  •  4
  •   Community CDub    7 年前

    我把这个直接从另一个帖子上的答案中删除了

    Getting at the "parent" of a databound object?

    以下是帖子中的代码,我认为这可能与你想做的事情有关:

    <ListBox Name="list" ItemsSource="{Binding Items}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding}"/>
                    <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, Path=DataContext.Values}"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    

    基本上,在这种情况下,列表框的DataContext包含一些列表,并且itemTemplate的DataTemplate中的组合框绑定到列表框的DataContext的其他成员,而itemsSource绑定到DataContext的items成员。我认为这可以应用于您的数据报和列模板。

        2
  •  0
  •   Wallstreet Programmer    15 年前

    解决方案1。创建一个包含集合和bool属性的自定义类,并将DataContext设置为该类的实例。

    解决方案2。将用户控件的DataContext设置为集合,并向用户控件添加bool属性。

    XAML:

    <UserControl x:Class="DataContextDemo.UserControl1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Name="self">
        <StackPanel>
            <ListBox ItemsSource="{Binding}" />
            <CheckBox IsChecked="{Binding Path=MyBoolProp, ElementName=self}" />
        </StackPanel>
    </UserControl>
    

    代码落后:

    using System.Windows;
    using System.Windows.Controls;
    
    namespace DataContextDemo
    {
        public partial class UserControl1 : UserControl
        {
            public UserControl1()
            {
                InitializeComponent();
            }
    
            public bool MyBoolProp
            {
                get { return (bool)GetValue(MyBoolPropProperty); }
                set { SetValue(MyBoolPropProperty, value); }
            }
    
            public static readonly DependencyProperty MyBoolPropProperty =
                DependencyProperty.Register("MyBoolProp", 
                                            typeof(bool), 
                                            typeof(UserControl1), 
                                            new UIPropertyMetadata(true));
        }
    }