如何在带有Caliburn.Micro和UserControl的WPF中使用绑定



我创建了一个带有一些字段的UserControl。我想使用它并将数据绑定到这些字段。其中大多数是静态值,但DataValue属性来自MainView的一个属性。我的代码:

DataDisplayer.xaml
<UserControl x:Class="TabletMachineAccess.Controls.DataDisplayer"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:TabletMachineAccess.Controls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Name="dataDisplayer"
MaxHeight="100"
mc:Ignorable="d">
<Border Height="auto"
Margin="5"
Padding="5,2,5,2"
BorderBrush="Gray"
BorderThickness="2"
CornerRadius="5">
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding DataType}" />
<TextBlock Text=":" />
</StackPanel>
<Separator Style="{StaticResource BasicSeparator}" />
<TextBlock Margin="0,0,0,0"
HorizontalAlignment="Center"
FontWeight="Bold"
Text="{Binding Path=DataValue,
ElementName=dataDisplayer}" />
<StackPanel HorizontalAlignment="Right" Orientation="Horizontal">
<TextBlock FontWeight="ExtraLight" Text="(" />
<TextBlock FontWeight="ExtraLight" Text="{Binding UnitText}" />
<TextBlock FontWeight="ExtraLight" Text=")" />
</StackPanel>
</StackPanel>
</Border>
</UserControl>
DataDisplayer.xaml.cs
public partial class DataDisplayer : UserControl
{
public double DataValue
{
get { return (double)GetValue(DataValueProperty); }
set { SetValue(DataValueProperty, value); }
}
// Using a DependencyProperty as the backing store for DataValue.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty DataValueProperty =
DependencyProperty.Register("DataValue", typeof(double), typeof(DataDisplayer), new PropertyMetadata(9.9));
public string DataType
{
get; set;
}
public string UnitText
{
get; set;
}
public DataDisplayer()
{
InitializeComponent();
this.DataContext = this;
}
}
我试着在MainView.xaml中这样使用它
<controls:DataDisplayer Grid.Row="1"
Grid.Column="0"
DataType="{x:Static res:Strings.PVUpper}"
DataValue="{Binding PVUpper}"
UnitText="{x:Static res:Strings.KgUnit}" />
我的MainViewModel.cs中有这个
public double PVUpper { get; set; }

对于那些从res:Strings获取数据的属性,它可以很好地工作并显示正确的值,但DataValue属性总是显示DependencyProperty的默认值(9.9(。PVUpper的值在ViewModel中每秒都会更改,所以我也希望在View中看到这种更改。

问题是绑定的DataContex错误。您将DataDisplayerDataContext-属性设置为自身

public DataDisplayer()
{
InitializeComponent();
this.DataContext = this;
}

因此绑定DataValue="{Binding PVUpper}"尝试在DataDisplayer实例上查找名称为PVUpper的属性,当然不会成功。

因此,您不应该执行this.DataContext = this;,而应该保持DataContext不变(您的控件将继承其父控件的数据上下文(。您还需要更改DataDisplayer.xaml中的绑定,以处理更改后的DataContext。

但是,您可以简单地向所有绑定添加一个ElementName=dataDisplayer,以绑定到您的DataDisplayer实例。

例如

<TextBlock FontWeight="ExtraLight" Text="{Binding UnitText}" />

成为

<TextBlock FontWeight="ExtraLight" Text="{Binding UnitText, ElementName=dataDisplayer}" />

相关内容

  • 没有找到相关文章

最新更新