在wpf

时间:2017-01-30 05:59:16

标签: c# wpf

我是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页面。

2 个答案:

答案 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;

在这里你可以找到一个例子:

Grid & Pivot Binding Example for multiple DataTemplates