![](/img/trans.png)
[英]How can I bind an ItemsControl.ItemsSource with a property in XAML?
[英]Bind a Property that is outside of an Itemscontrol in XAML
我正在嘗試綁定ItemsControl之外的Property。 但是,這似乎不起作用。
似乎在ItemsControl中,DataTemplate引用的是集合內部的內容,而不是集合外部的內容。 我已經嘗試過使用RelativeResource並為ViewModel引用AncestorType。
代碼(VM):
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>
將每一行的上下文設置為綁定列表中的每個對象。 在我們的例子中,從items集合到每個Model實例。
返回到父級的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 { };
}
結果,您可以訪問在父級的DataContext上定義的屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.