首页 > 解决方案 > WPF C#中自定义用户控件的绑定

问题描述

我制作了一个自定义 UserControl,在 ProgressBar 中显示文本,显示由“showPercentage”布尔值定义的百分比或时间。

XAML

<UserControl x:Class="ProgressBar.ProgressBarText"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:ProgressBar"
             mc:Ignorable="d" 
             d:DesignHeight="20" d:DesignWidth="100">
    <Grid>
        <Rectangle x:Name="pBorder" Fill="LightGray" HorizontalAlignment="Stretch"  VerticalAlignment="Stretch" Stroke="Black" StrokeThickness="1"/>
        <Rectangle x:Name="pFill" Fill="Green" Stroke="Transparent" StrokeThickness="2" HorizontalAlignment="Left" VerticalAlignment="Stretch" Width="100"/>
        <Viewbox>
            <Label x:Name="pLabel" HorizontalAlignment="Center" VerticalAlignment="Center" Content="Test"/>
        </Viewbox>
    </Grid>
</UserControl>

C# 代码

using ...

namespace ProgressBar
{
    /// <summary>
    /// Interaktionslogik für ProgressBarText.xaml
    /// </summary>
    public partial class ProgressBarText : UserControl
    {


        public int Value { get; set; }
        public bool showPercentage { get; set; }
        public double percentage { get; set; }
        public int Maximum { get; set; }


        public ProgressBarText()
        {
            InitializeComponent();
        }

        public void getValues()
        {
            if (Maximum != 0)
            {
                percentage = ((double)Value / Maximum) * 100;
                pFill.Width = this.Width * percentage / 100;

                if (showPercentage == true)
                {
                    pLabel.Content = percentage.ToString() + "%";
                }
                else
                {
                    int Days = (int)(Maximum - Value) / 60 / 24;
                    int Hours = (int)((Maximum - Value) - (Days * 24 * 60))/60;
                    int Minutes = (int)((Maximum - Value) - (Hours * 60) - (Days * 24 * 60));

                    if (Days > 0)
                    {
                        pLabel.Content = Days.ToString() + "d " + Hours.ToString() + "h " + Minutes.ToString() + "m";

                    }
                    else
                    {
                        if (Hours > 0)
                        {
                            pLabel.Content = Hours.ToString() + "h " + Minutes.ToString() + "m";
                        }
                        else
                        {
                            pLabel.Content = Minutes.ToString() + "m";
                        }
                    }

                }
            }
        }
    }
}

在我的 MainWindow 中,我得到了一个 ListView,它应该使用我的自定义控件为每个 Name 显示一行。我制作了一个名为“Progress”的自定义类

列表视图 XAML

 <ListView x:Name="lvProgress" Grid.Column="1" Margin="10">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}">
                    </GridViewColumn>
                    <GridViewColumn Header="ProgressValue">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <local:ProgressText Value="{Binding ProgressValue}" Maximum="{Binding ProgressMax}"  Width="100" Height="15" showPercentage="false"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Date" DisplayMemberBinding="{Binding Datum}"/>
                </GridView>
            </ListView.View>
        </ListView>

C# 进度类

 List<Progress> SeriesCollection = new List<Progress>();


public class Progress{
            public string pbName { get; set; }
            public string Name { get; set; }
            public DateTime CreateDate { get; set; }
            public int ProgressValue { get; set; }
            public int ProgressMax { get; set; }
            public string DateFinished { get; set; }

       public void GetChanges()
        {
           foreach(Progress progress in SeriesCollection)
            {
                progress.Update();
            }
            lvProgress.ItemsSource = SeriesCollection;

        }

       public void AddListItem(string name, int baketime, DateTime date)
        {
            SeriesCollection.Add(new Progress() {pbName="pb"+name, Name = name,CreateDate = date, ProgressMax = baketime, ProgressValue = (int)TimeSpan.FromTicks(DateTime.UtcNow.Ticks - date.Ticks).TotalMinutes, DateFinished = date.AddDays((int)(baketime/60/24)).ToString("dd.MM.yyyy HH:mm") });
        }
}

这对我不起作用。我尝试将 ProgressText 属性设置为 DependencyProperties,但这也不起作用。

有没有简单的方法来解决这个问题。解释自定义用户控件的文章或书籍也很受欢迎。

谢谢马克斯

标签: c#wpfbindinguser-controls

解决方案


推荐阅读