绑定 XAML 中 Itemscontrol 之外的 属性
Bind a Property that is outside of an Itemscontrol in XAML
我正在尝试绑定 Itemscontrol 之外的 属性。
然而,这似乎不起作用。
似乎在ItemsControl、DataTemplate 中它指的是集合内部的内容而不是集合外部的内容。
我已经尝试使用 RelativeResource 并为 ViewModel 引用 AncestorType。
代码(虚拟机):
public class Test {
public string GetThis {get{return "123";} set{}}
public List<string> IterateProperty {get; set;}
}
XAML(查看):
<ItemsControl ItemsSource="{Binding Path=IterateProperty}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="I want to bind the string property GetThis!" />
您需要绑定到父 ItemsControl
的 DataContext
。
<ItemsControl ItemsSource="{Binding Path=IterateProperty}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding DataContext.GetThis,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type ItemsControl}}}" />
我已经为此做了一个快速而完整的示例:
<Window x:Class="ParentDataContext.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid ItemsSource="{Binding items}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsChecked}"></CheckBox>
<TextBlock Margin="5"
Text="{Binding Path=DataContext.TextFromParent,RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
每一行的上下文都设置为绑定列表中的每个 object。在我们的例子中,到项目集合中的每个模型实例。
要返回 parent 的 DataContext,使用以下语法:
Text="{Binding Path=DataContext.TextFromParent,RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
这是代码隐藏:
public partial class MainWindow : Window
{
public string TextFromParent
{
get { return (string)GetValue(TextFromParentProperty); }
set { SetValue(TextFromParentProperty, value); }
}
// Using a DependencyProperty as the backing store for TextFromParent. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TextFromParentProperty =
DependencyProperty.Register("TextFromParent", typeof(string), typeof(MainWindow), new PropertyMetadata(string.Empty));
public ObservableCollection<Model> items { get; set; }
public MainWindow()
{
InitializeComponent();
items = new ObservableCollection<Model>();
items.Add(new Model() { IsChecked = true });
items.Add(new Model() { IsChecked = false });
items.Add(new Model() { IsChecked = true });
items.Add(new Model() { IsChecked = false });
TextFromParent = "test";
this.DataContext = this;
}
}
您可以在 ViewModel 中定义依赖项 属性。
这是我的简单模型:
public class Model : INotifyPropertyChanged
{
private bool _IsChecked;
public bool IsChecked
{
get { return _IsChecked; }
set
{
_IsChecked = value;
PropertyChanged(this, new PropertyChangedEventArgs("IsChecked"));
}
}
public event PropertyChangedEventHandler PropertyChanged = delegate { };
}
因此,您可以访问 parent 的 DataContext 上定义的 属性。
我正在尝试绑定 Itemscontrol 之外的 属性。 然而,这似乎不起作用。
似乎在ItemsControl、DataTemplate 中它指的是集合内部的内容而不是集合外部的内容。 我已经尝试使用 RelativeResource 并为 ViewModel 引用 AncestorType。
代码(虚拟机):
public class Test {
public string GetThis {get{return "123";} set{}}
public List<string> IterateProperty {get; set;}
}
XAML(查看):
<ItemsControl ItemsSource="{Binding Path=IterateProperty}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="I want to bind the string property GetThis!" />
您需要绑定到父 ItemsControl
的 DataContext
。
<ItemsControl ItemsSource="{Binding Path=IterateProperty}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding DataContext.GetThis,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type ItemsControl}}}" />
我已经为此做了一个快速而完整的示例:
<Window x:Class="ParentDataContext.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid ItemsSource="{Binding items}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsChecked}"></CheckBox>
<TextBlock Margin="5"
Text="{Binding Path=DataContext.TextFromParent,RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
每一行的上下文都设置为绑定列表中的每个 object。在我们的例子中,到项目集合中的每个模型实例。
要返回 parent 的 DataContext,使用以下语法:
Text="{Binding Path=DataContext.TextFromParent,RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
这是代码隐藏:
public partial class MainWindow : Window
{
public string TextFromParent
{
get { return (string)GetValue(TextFromParentProperty); }
set { SetValue(TextFromParentProperty, value); }
}
// Using a DependencyProperty as the backing store for TextFromParent. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TextFromParentProperty =
DependencyProperty.Register("TextFromParent", typeof(string), typeof(MainWindow), new PropertyMetadata(string.Empty));
public ObservableCollection<Model> items { get; set; }
public MainWindow()
{
InitializeComponent();
items = new ObservableCollection<Model>();
items.Add(new Model() { IsChecked = true });
items.Add(new Model() { IsChecked = false });
items.Add(new Model() { IsChecked = true });
items.Add(new Model() { IsChecked = false });
TextFromParent = "test";
this.DataContext = this;
}
}
您可以在 ViewModel 中定义依赖项 属性。
这是我的简单模型:
public class Model : INotifyPropertyChanged
{
private bool _IsChecked;
public bool IsChecked
{
get { return _IsChecked; }
set
{
_IsChecked = value;
PropertyChanged(this, new PropertyChangedEventArgs("IsChecked"));
}
}
public event PropertyChangedEventHandler PropertyChanged = delegate { };
}
因此,您可以访问 parent 的 DataContext 上定义的 属性。