簡體   English   中英

如何在UserControl中綁定數據?

[英]How to bind data in a UserControl?

這不是重復的(我希望)。 最近兩個小時,我都在搜索Google和SO來使用。 我試圖將TextBlock.Text屬性綁定到我的用戶控件上的一些公共屬性,如下所示:

### Multimeter Overview Usercontrol Code Behind ###

public partial class MultimeterOverview : UserControl
{
    public string MeterName { get; set; }
    public int GoodPackets { get; set; }
    public int InvalidPackets { get; set; }
    public TimeSpan ElapsedTime { get; set; }
    public double MaxValue { get; set; }
    public double MinValue { get; set; }
    public double CurrentValue { get; set; }
    public string CurrentUnits { get; set; }
    public string CurrentStatus { get; set; }

    public Multimeter multimeter;
    public MainWindow program;

    public MultimeterOverview() //This method is not called...at all.
    {
        InitializeComponent();
        this.DataContext = this;
    }

    public MultimeterOverview(MainWindow reference, Multimeter multi) //This one is called
    {
        InitializeComponent();
        this.DataContext = this;
        program = reference;
        multimeter = multi;
    }
}

為了簡潔起見,刪除了不相關的代碼:

### Multimeter Overview Class XAML ###

<UserControl x:Name="Overview" x:Class="jLogger.MultimeterOverview"
         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:properties="clr-namespace:jLogger.Properties"
         xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
         xmlns:d3="clr-namespace:Microsoft.Research.DynamicDataDisplay;assembly=DynamicDataDisplay"
         xmlns:d3e="clr-namespace:Microsoft.Research.DynamicDataDisplay.Charts;assembly=DynamicDataDisplay"
         mc:Ignorable="d"
         d:DesignHeight="110" d:DesignWidth="300" MinWidth="300">

           <Grid>
                <TextBlock Grid.Row="0" FontSize="20" FontFamily="Segoe UI Semilight" Margin="5, 0, 0, 0" Foreground="{StaticResource AccentColorBrush}" Text="{Binding MeterName}"/>

                <Label Grid.Row="0" Grid.Column="0" Content="Status:" Foreground="{StaticResource AccentColorBrush}" Padding="5,2,2,2"/>
                <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding ElementName=Overview, Path=CurrentStatus, Mode=TwoWay}" Foreground="Black" VerticalAlignment="Center" Margin="5, 0, 0, 0"/>

                <Label Grid.Row="1" Grid.Column="0" Content="Elapsed Time:" Foreground="{StaticResource AccentColorBrush}" Padding="5,2,2,2"/>
                <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding ElementName=Overview, Path=ElapsedTime}" Foreground="Black" VerticalAlignment="Center" Margin="5, 0, 0, 0"/>

                <Label Grid.Row="2" Grid.Column="0" Content="Good Packets:" Foreground="{StaticResource AccentColorBrush}" Padding="5,2,2,2"/>
                <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding ElementName=Overview, Path=GoodPackets}" Foreground="Black" VerticalAlignment="Center" Margin="5, 0, 0, 0"/>

                <Label Grid.Row="3" Grid.Column="0" Content="Invalid Packets:" Foreground="{StaticResource AccentColorBrush}" Padding="5,2,2,2"/>
                <TextBlock Grid.Row="3" Grid.Column="1" Text="{Binding ElementName=Overview, Path=InvalidPackets}" Foreground="Black" VerticalAlignment="Center" Margin="5, 0, 0, 0"/>
            </Grid>
    </UserControl>

該控件被動態加載到ScrollViewer內部的Grid 然后,我設置MeterNameCurrentStatus的值(兩者都使用不同的綁定,以嘗試使其正常工作)。 但是,UI不會更新,並且不會顯示值。 但是,我已經確認通過打印MultimeterOverview.CurrentStatusMeterName設置該值,並且它們都包含正確的值。

有誰知道我如何將UserControl UI成功綁定到UserControl 我努力了:

1. <UserControl ... DataContext="{Binding RelativeSource={RelativeSource Self}}">
2. this.DataContext = this; //In MultimeterOverview

我懷疑setting the values once UserControl gets loadedsetting the values once UserControl gets loaded

您需要在類MultimeterOverview上實現INotifyPropertyChanged接口,以便UI可以在類對象的任何屬性更改時得到通知。

樣本屬性:

private string meterName;
public string MeterName
{
   get
   {
      return meterName;
   }
   set
   {
      if(meterName != value)
      {
         meterName = value;
         OnPropertyChanged("MeterName");
      }
   }
}

您需要使其他屬性遵循上述相同的語法。

標准屬性不支持綁定。 您需要將屬性實現為依賴項屬性。 您的XAML正常。 需要保持DataContext不變,以便控件可以“查看”其父級的DataContext。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM