在WPF数据绑定中,我知道你有DataContext一个告诉元素它将绑定到哪个数据以及ItemsSource哪个"绑定".
但是,例如在这个简单的例子中,它似乎没有ItemsSource做任何有用的事情,因为,除了绑定它之外,你还想要Element做什么DataContext呢?
<ListBox DataContext="{StaticResource customers}"
ItemsSource="{Binding}">
Run Code Online (Sandbox Code Playgroud)
在更复杂的例子中ItemsSource,你有路径和来源似乎正在侵占其领土DataContext.
ItemsSource="{Binding Path=TheImages, Source={StaticResource ImageFactoryDS}}"
Run Code Online (Sandbox Code Playgroud)
了解这两个概念的最佳方法是什么,以了解何时以及如何在各种编码方案中应用它们?
我有一些奇怪的行为,我似乎无法解决.当我遍历ListBox.ItemsSource属性中的项目时,我似乎无法获取容器?我期待看到一个ListBoxItem返回,但我只得到null.
有任何想法吗?
这是我正在使用的一些代码:
this.lstResults.ItemsSource.ForEach(t =>
{
ListBoxItem lbi = this.lstResults.ItemContainerGenerator.ContainerFromItem(t) as ListBoxItem;
if (lbi != null)
{
this.AddToolTip(lbi);
}
});
Run Code Online (Sandbox Code Playgroud)
ItemsSource当前设置为Dictionary并且包含许多KVP.
我不太熟悉ItemsSource和DataContext之间的区别.有人能解释一下并用例子来支持吗?我何时会使用其中一个.
我正在阅读文档,它说我可以使用DataContext进行绑定,但是我会在其中抛出一个ObservableCollection,并且列表中没有任何内容.如果我在ItemsSource上抛出相同的集合,它可以正常工作.
有谁知道如何定制ItemsSource?
我想做的是为了itemsSource自己UserControl做一个让它受到约束ObservableCollection<>.
另外,我可以知道每当itemsSource更新的项目数量,以便做进一步的程序.
非常感谢.
我目前有一个ListBox,其ItemsSource集合绑定到我的viewmodel上的一个属性,类型为IEnumerable.当preoprty的引用发生更改时,ListBox会按预期更新,但是我有一个问题,如果我有大量项目并滚动到ListBox的底部,然后将引用更改为包含,例如,1项目的另一个集合,ListBox视图为空,不显示滚动条.然后我必须用鼠标滚轮向上滚动列表框,直到1项进入视图.
因此,我认为我所追求的是,只要ItemsSource属性发生更改,就会将ListBox的滚动位置重置为顶部,这样无论收集的大小有多少,都会始终显示某些内容.
我正在尝试创建一个ItemsControl使用网格ItemsPanel的方式,它有两个列,其中第一列宽度是该列中最宽项目的宽度,并且可能需要行显示所有项目
基本上,我想要以下内容,但不知何故ItemsControl,我可以绑定到一组对象:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Label Content="{Binding Items[0].Header}"/>
<TextBox Text="{Binding Items[0].Content}" Grid.Column="1"/>
<Label Content="{Binding Items[1].Header}" Grid.Row="1"/>
<TextBox Text="{Binding Items[1].Content}" Grid.Row="1" Grid.Column="1"/>
<Label Content="{Binding Items[2].Header}" Grid.Row="2"/>
<TextBox Text="{Binding Items[2].Content}" Grid.Row="2" Grid.Column="1"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)
编辑:雷切尔的答案很有效,这是一个有效的例子.
(我将Grid.IsSharedSizeScope ="True"移动到ItemsPanel,不确定Rachel是否打算将它放在ItemTemplate中(这不起作用))
namespace WpfApplication23
{
public partial class Window1 : Window
{
public List<Item> Items { get; set; }
public Window1()
{
Items = new List<Item>()
{
new Item(){ Header="Item0", …Run Code Online (Sandbox Code Playgroud) 我有以下属性Temp2:(我的UserControl实现INotifyPropertyChanged)
ObservableCollection<Person> _Temp2;
public ObservableCollection<Person> Temp2
{
get
{
return _Temp2;
}
set
{
_Temp2 = value;
OnPropertyChanged("Temp2");
}
}
public event PropertyChangedEventHandler PropertyChanged = delegate { };
private void OnPropertyChanged(string propertyName)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
Run Code Online (Sandbox Code Playgroud)
我需要动态创建一个列表视图.我在XAML中有以下列表视图:
<ListView
Name="listView1"
DataContext="{Binding Temp2}"
ItemsSource="{Binding}"
IsSynchronizedWithCurrentItem="True">
<ListView.View>
.... etc
Run Code Online (Sandbox Code Playgroud)
现在我尝试用c#创建相同的listview:
ListView listView1 = new ListView();
listView1.DataContext = Temp2;
listView1.ItemsSource = Temp2; // new Binding(); // ????? how do I have to implement this line
listView1.IsSynchronizedWithCurrentItem = true;
//.. etc
Run Code Online (Sandbox Code Playgroud)
当我使用C#填充listview时,listview不会被填充.我究竟做错了什么?
我在XAML中创建了一个DataGrid,并将ItemsSource绑定到包含属性的某个类的ObservableCollection.然后在C#中,我创建了一个DataGridTextColumn和一个DataGridComboBoxColumn,并将这些绑定到ObservableCollection内对象的属性.我可以将DataGridComboBoxColumn绑定到一个简单的Collection,但我想要做的是将它绑定到一组字符串集合,这样对于每一行,DataGrid中的ComboBox都有一个不同的字符串集合.我没有这样做......
如何绑定DataGridCombBoxColumn以便我可以为此类型列的每一行设置不同的字符串集合?
XAML:
<Window>
<!-- ... -->
WPFToolkit:DataGrid
x:Name="DG_Operations"
Margin="10,5,10,5"
Height="100"
HorizontalAlignment="Stretch"
FontWeight="Normal"
ItemsSource="{Binding Path=OperationsStats}"
AlternatingRowBackground="{DynamicResource SpecialColor}"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Visible"
SelectionMode="Extended"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserResizeRows="True"
CanUserSortColumns="True"
AutoGenerateColumns="False"
IsReadOnly="False"
IsEnabled="True"
BorderThickness="1,1,1,1"
VerticalAlignment="Stretch"/>
<!-- ... -->
</Window>
Run Code Online (Sandbox Code Playgroud)
C#:
public class DataModelStatsOperations
{
public ObservableCollection<IStatsOperation> OperationsStats { get; set; }
}
public interface IStatsOperation
{
string Operation { get; set; }
Collection<string> Data{ get; set; }
}
public class StatsOperation : IStatsOperation
{
public StatsOperation(string operation, Collection<string> data)
{
Operation = operation; …Run Code Online (Sandbox Code Playgroud) 我有一个ComboBox,它的ItemsSource绑定到一个静态List<CustomSettings>的选项.ComboBox是绑定到CustomObject类的表单的一部分,该类的一个属性是CustomSettingProperty.
我想将ComboBox的SelectedItem绑定到CustomObject中指定的属性,但是SelectedItem="{Binding Path=CustomSettingProperty}"没有设置默认的选定项.使用断点我可以看到它正在调用get;方法,所以我认为问题可能在于CustomSettingProperty是单独创建的,List<CustomObject>因此WPF认为它不是同一个项目.
是否有捷径可寻?或者也许是另一种选择,因为CustomSettings类确实包含Id?
我在名为"Article"的类中有以下静态方法:
public static ObservableCollection<Article> GetObservableCollection() { ... }
Run Code Online (Sandbox Code Playgroud)
我想将它直接绑定到ComboBox的ItemsSource属性,但是在XAML而不是代码中,我找不到正确的语法.
它应该看起来像我想的那样(EmacGbscCore是包含Article对象的程序集):
ItemsSource="{Binding Source={x:Static EmacGbscCore:Article.GetObservableCollection}}"
Run Code Online (Sandbox Code Playgroud)
提前感谢您的帮助.
itemssource ×10
wpf ×8
datacontext ×3
binding ×2
c# ×2
data-binding ×2
listbox ×2
combobox ×1
containers ×1
datagrid ×1
grid ×1
itemscontrol ×1
methods ×1
scroll ×1
selecteditem ×1
silverlight ×1