我是wpf的新手,我创建了一个列表框,它将创建一个动态列表项,这里我使用了datetemplate,其中包含两个控件,即两个文本块,一个textblocks包含绑定值组合形式的组合框(即字符串数据类型),另一个是,绑定代码绑定的值。
XAML
<ListBox ItemsSource="{Binding obj}" HorizontalContentAlignment="Left" x:Name="lstbxindex" SelectionMode="Extended" Foreground="White" FontSize="20px" Height="201" BorderBrush="#555555" Margin="80,40,0,0" VerticalAlignment="Top" Width="282" Background="#555555" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="5" >
<TextBlock Height="40px" Width="80px" Text="{Binding roundedhourvalue, FontSize="24" Background="#555555" Foreground="White"></TextBlock>
<TextBlock x:Name="items" Text="{Binding}" Margin="35,0,0,0"></TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
C#(Roundedhour.cs)
public class Roundedhour
{
public string hourvalue { get; set; }
public override string ToString()
{
return string.Format("{0}", hourvalue);
}
}
在此类中为hourvalue创建一个属性。对于这个类,我在codebehind文件中创建了一个对象,我在下面提到过。创建一个对象并为hourvalue变量赋值。
C#(代码背后)
{
if (dispatcherTimer1.Interval == TimeSpan.FromSeconds(15))
{
//lstbxindex.Items.Add(lstbxindex.SelectedItem.ToString());
string hrvalue = Convert.ToString(hrvalueinitially);
obj = new Roundedhour();
obj.hourvalue = Convert.ToString(hrvalueinitially);
string roundedhourvalue =obj.hourvalue;
this.DataContext = this;
//lblprojectAhr.Content = string.Join(",", hrvalueinitially + "" + "hr");
}
}
在这里,我为Rounderhour类创建了一个对象。将值赋值给该属性小时值。但是我无法将codebind中的值绑定到XAML页面。
答案 0 :(得分:1)
您的ItemsSource
应为CollectionType
。
ListBox ItemsSource="{Binding obj}"
您还应该开始为变量和属性提供有意义的名称。这使得以后更容易阅读您的代码 n。
第二个问题出现在Binding
本身。
你这样绑定:Text="{Binding roundedhourvalue}
因此,WPF期待roundedhourvalue
上的媒体资源obj
。
但如您的CodeBehind
所示,只有obj.hourvalue
。
所以将绑定更改为Text="{Binding hourvalue}
查看您的Output-Window
了解详情。
注意:强>
string roundedhourvalue = obj.hourvalue;
没有getter
,因为其private
已无法使用。
注意:您可以使用Binding
或设置CodeBehind中的ItemsSource。
试试这样:
只需删除所有格式和内容:
<ListBox ItemsSource="{Binding RoundedHours}" x:Name="ListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="5" >
<TextBlock Text="{Binding hourvalue}"></TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
将代码隐藏更改为:
private void UpdateDataContext(object hrvalueinitially)
{
List<Roundedhour> hours = new List<Roundedhour>();
hours.Add(new Roundedhour()
{
hourvalue = hrvalueinitially.ToString()
});
//Set the ItemsSource in code: => remove your ItemsSource Binding from XAML
listBox.ItemsSource = hours;
}
或者您可以使用“MVVM”方法:
public class MyViewModel : INotifyPropertyChanged
{
//IMPLEMENT INotifyPropertyChanged HERE PLS
public ObservableCollection<RoundedHour> Collection { get; set; } = new ObservableCollection<RoundedHour>();
private void AddToCollection(object hrvalueinitially)
{
Collection.Add(new RoundedHour()
{
hourvalue = hrvalueinitially.ToString()
});
OnPropertyChanged("Collection");
}
//Make sure to set your Windows DataContext to an Instance of this Class
}
答案 1 :(得分:-1)
使用绑定变量分配XAML对象的“ItemsSource”属性。
将对象本身绑定到对象的属性(如
)是完全错误的this.DataTemplate = this;
使用:
List<yourobject> bindingObjectList = new List<yourobject>();
// insert your objects into the list
this.ItemsSource = bindingObjectList;
在这里你可以找到一个例子: