0

2 つのプロパティにバインドされたラベルを取得して、2 番目の変更に対応しようとしています。

この背後にある基本は、メートル法と帝国を切り替えるときにフィールドの単位ラベルを変更することです。

画像 http://s7.postimage.org/wmw3vofmj/test.png

XAML コードは次のとおりです。

<Label Name="UnitLabel" Grid.Column="1" Foreground="#FF1414AA" HorizontalContentAlignment="Right" VerticalContentAlignment="Center" Padding="2,2,5,2">
    <Label.Content>
        <MultiBinding Converter="{units:UnitConvertor}" Mode="OneWay">
            <Binding Path="Unit" />
            <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=base:MainForm, AncestorLevel=3}" Path="Document.Units" />
        </MultiBinding>
    </Label.Content>
</Label>

ラベルはユーザー コントロールでホストされ、実際のドキュメントには次の多くが含まれます。

画像 http://s9.postimage.org/47hvp9uyn/test.png

Document オブジェクトを以下に示します。

public class Document : DependencyObject
{
    public static readonly DependencyProperty UnitsProperty =
        DependencyProperty.Register("Units", typeof (UnitSet), typeof (Document), new PropertyMetadata(default(UnitSet)));

    public UnitSet Units
    {
        get { return (UnitSet) GetValue(UnitsProperty); }
        set { SetValue(UnitsProperty, value); }
    }

    public Document()
    {
        Units = UnitSet.Imperial;
    }
}

次に、Units プロパティを設定してみます。

private void ChangeUnit(object sender, RoutedEventArgs e)
{
    if (sender == Metric)
    {
        Document.Units = UnitSet.Metric;
    }
    else if (sender == Imperial)
    {
        Document.Units = UnitSet.Imperial;
    }
}

ただし、ユニット ラベルは更新されません。これを修正するにはどうすればよいですか? 明らかな何かが見落とされている場合はお詫び申し上げます。私は 2 日前に WPF を開始しました。

4

1 に答える 1

3

完全な XAML ツリーはわかりませんが、AncestorLevel が間違っていると思います。MainForm がルート要素であると推測していますが、そのバインディングで、そのラベルの上の 3 番目の MainForm を探していると言っています。AncestorLevel を完全に削除してみてください。デフォルトは 1 です。

于 2013-01-30T13:18:07.290 に答える