[英]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
。 然后,我設置MeterName
和CurrentStatus
的值(兩者都使用不同的綁定,以嘗試使其正常工作)。 但是,UI不會更新,並且不會顯示值。 但是,我已經確認通過打印MultimeterOverview.CurrentStatus
和MeterName
設置該值,並且它們都包含正確的值。
有誰知道我如何將UserControl UI
成功綁定到UserControl
? 我努力了:
1. <UserControl ... DataContext="{Binding RelativeSource={RelativeSource Self}}">
2. this.DataContext = this; //In MultimeterOverview
我懷疑setting the values once UserControl gets loaded
在setting 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.