如何在WPF C#中将字符串绑定到标签内容?

u4dcyp6a  于 2023-03-24  发布在  C#
关注(0)|答案(1)|浏览(140)

我目前正在做一个项目,我主要专注于后端,我知道这个XAML代码不是很好的做法。我真的不习惯INotifyPropertyChanged接口,我真的很难看到错误。当我调试程序时,TourName不是空的,它从www.example.com获取值liveTourAppointment.tour.name;但是当我运行它时,窗口中的Label保持为空
下面是我的尝试:
XAML代码:

<Grid>
        
        <Label x:Name ="Label" Content="{Binding Path=TourName}" Margin="82,44,579,354"/>

    </Grid>
</Window>

后面的代码在这里:

public partial class LiveTourWin : Window, INotifyPropertyChanged
    {
        public TourAppointment liveTourAppointment { get; set; }
        
        private string _tourName =".";
        public string TourName
        {
            get { return _tourName; }
            set
            {
                {
                    if (value != _tourName)
                    {
                        _tourName = value;
                        OnPropertyChanged(nameof(TourName));
                    }
                }
            }
        }

        private readonly TourAppointmentController _tourAppointmentController;
        public LiveTourWin(int guideId)
        {
            InitializeComponent();
            this.DataContext = this;

            _tourAppointmentController = new TourAppointmentController();
            

            liveTourAppointment = _tourAppointmentController.GetLiveTour(guideId);
            this.TourName = liveTourAppointment.tour.name;
            
        }

        protected virtual void OnPropertyChanged(string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        public event PropertyChangedEventHandler? PropertyChanged;
    }
}
nafvub8i

nafvub8i1#

您的绑定已找到。您遇到的问题是边距。您正在进行一些绝对设置。请尽量不要这样做。“窗口”中的每个对象(如网格对象)都会占用全部可用空间。就像浏览器一样。您可以调整窗口大小,并且通常会自动调整列等。
要做到这一点,在窗口中分配空间并自动调整以允许收缩/扩展。现在,如何做到这一点。

<Grid>
    <!-- Example of 3 equally sized columns -->
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <!-- multiple rows with different fixed heights.
         The last row with "*" means take up all unused space for the rest -->
    <Grid.RowDefinitions>
        <RowDefinition Height="30" />
        <RowDefinition Height="28" />
        <RowDefinition Height="28" />
        <RowDefinition Height="100" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <!-- Place whatever controls at specific row/column locations -->
    <Label Grid.Row="3" Grid.Column="2" (rest of label content />
</Grid>

此外,您可以分配一个最小大小PLUS“”,以允许基于可用的拉伸,如下图所示。这有3列。第一列固定为120像素,但其余两列有预定义的最小值,但由于“”在两者上,它们可以根据可用的拉伸或收缩。因此,假设窗口是800宽。第一列仍然是120,第二个和第三个分别得到200和350,总共是670,剩下130。由于两列有“*”,因此每列将获得额外的宽度65。这同样适用于行定义。

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="120" />
    <ColumnDefinition Width="200*" />
    <ColumnDefinition Width="350*" />
</Grid.ColumnDefinitions>

还有其他类型的控件,StackPanels,DockPanels等,允许其他格式和对齐选项。
所以,你的绑定工作,但如果你给予它一个指定的位置,是预先分配的空间,因为你将最终准备你的用户界面,使什么适合你,而不是担心“固定”的利润等。
另外注意,对于标签,因为它们通常是预先生成的,所以您可能需要在绑定子句中添加以下内容

<Label x:Name ="Label" Content="{Binding Path=TourName, NotifyOnSourceUpdated=True}" />

相关问题