在 Wpf 中获取祖先源
Get Ancestor Source in Wpf
我正在尝试获取祖先 ItemsControl.ItemTemplate 源作为我的 DataGrid 源,但我无法处理这种情况。我在 xaml 中尝试了以下案例。但它没有用,数据网格是空的。
这是我的 xaml:
<ItemsControl ItemsSource="{Binding Accounts}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Expander ExpandDirection="Down" FlowDirection=" RightToLeft">
<Expander.Header>
<DataGrid FlowDirection="LeftToRight"
ItemsSource="{RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemTemplate}}}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding UserName}" />
<DataGridTextColumn Binding="{Binding Password}" />
</DataGrid.Columns>
</DataGrid>
</Expander.Header>
</Expander>
</DataTemplate>
</ItemsControl.ItemTemplate>
帐户 属性 实现如下:
public List<User> Accounts = new List<User>();
Accounts.Add(new User("userName1","password1"));
Accounts.Add(new User("userName2","password2"));
我的 User.cs 就像:
public class User : INotifyPropertyChanged
{
public string UserName{get; set;}
public string Password{get; set;}
public UserAccount(string userName, string password)
{
UserName = userName;
Password = password;
}
}
基本上,此代码不会创建绑定
ItemsSource="{RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemTemplate}}}"
祖先类型也不正确。
试试这个绑定:
ItemsSource="{Binding Path=DataContext.Accounts, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}"
或使用元素名称:
<ItemsControl Name="LstAccounts" ItemsSource="{Binding Accounts}">
和
ItemsSource="{Binding Path=DataContext.Accounts, ElementName=LstAccounts}"
上面的代码修复了绑定,但产生了意外的结果。这是在 DataGrid
中显示单个对象的解决方案
我为 ItemSource 绑定创建了一个转换器 ()
public class ItemsSourceConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
// doesn't allow to add new rows in DataGrid
return Enumerable.Repeat(value, 1).ToArray();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
这里是修改后的ItemsControl。转换器存储在资源中并在 ItemsSource 绑定中使用。 DataGrid 自动生成列
<ItemsControl ItemsSource="{Binding Accounts}">
<ItemsControl.Resources>
<local:ItemsSourceConverter x:Key="Enumerator"/>
</ItemsControl.Resources>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Expander ExpandDirection="Down" FlowDirection=" RightToLeft">
<Expander.Header>
<DataGrid FlowDirection="LeftToRight"
ItemsSource="{Binding ., Converter={StaticResource Enumerator}}"/>
</Expander.Header>
</Expander>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
这里是截图
我正在尝试获取祖先 ItemsControl.ItemTemplate 源作为我的 DataGrid 源,但我无法处理这种情况。我在 xaml 中尝试了以下案例。但它没有用,数据网格是空的。
这是我的 xaml:
<ItemsControl ItemsSource="{Binding Accounts}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Expander ExpandDirection="Down" FlowDirection=" RightToLeft">
<Expander.Header>
<DataGrid FlowDirection="LeftToRight"
ItemsSource="{RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemTemplate}}}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding UserName}" />
<DataGridTextColumn Binding="{Binding Password}" />
</DataGrid.Columns>
</DataGrid>
</Expander.Header>
</Expander>
</DataTemplate>
</ItemsControl.ItemTemplate>
帐户 属性 实现如下:
public List<User> Accounts = new List<User>();
Accounts.Add(new User("userName1","password1"));
Accounts.Add(new User("userName2","password2"));
我的 User.cs 就像:
public class User : INotifyPropertyChanged
{
public string UserName{get; set;}
public string Password{get; set;}
public UserAccount(string userName, string password)
{
UserName = userName;
Password = password;
}
}
基本上,此代码不会创建绑定
ItemsSource="{RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemTemplate}}}"
祖先类型也不正确。
试试这个绑定:
ItemsSource="{Binding Path=DataContext.Accounts, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}"
或使用元素名称:
<ItemsControl Name="LstAccounts" ItemsSource="{Binding Accounts}">
和
ItemsSource="{Binding Path=DataContext.Accounts, ElementName=LstAccounts}"
上面的代码修复了绑定,但产生了意外的结果。这是在 DataGrid
中显示单个对象的解决方案我为 ItemSource 绑定创建了一个转换器 (
public class ItemsSourceConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
// doesn't allow to add new rows in DataGrid
return Enumerable.Repeat(value, 1).ToArray();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
这里是修改后的ItemsControl。转换器存储在资源中并在 ItemsSource 绑定中使用。 DataGrid 自动生成列
<ItemsControl ItemsSource="{Binding Accounts}">
<ItemsControl.Resources>
<local:ItemsSourceConverter x:Key="Enumerator"/>
</ItemsControl.Resources>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Expander ExpandDirection="Down" FlowDirection=" RightToLeft">
<Expander.Header>
<DataGrid FlowDirection="LeftToRight"
ItemsSource="{Binding ., Converter={StaticResource Enumerator}}"/>
</Expander.Header>
</Expander>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
这里是截图