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

问题描述 投票:0回答:1

我创建了一个带有某些字段的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上看到此更改。

c# wpf data-binding user-controls caliburn.micro
1个回答
0
投票

问题是绑定的DataContex错误。您将DataContextDataDisplayer-属性设置为isself

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

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

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

但是您可以simplay向所有绑定中添加ElementName=dataDisplayer以绑定到您的DataDisplayer实例。

例如,]

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

成为

<TextBlock FontWeight="ExtraLight" Text="{Binding UnitText, ElementName=dataDisplayer}" />
© www.soinside.com 2019 - 2024. All rights reserved.