列中的继承值

时间:2012-02-15 08:15:41

标签: c# wpf xaml data-binding

我们有一个带有一些文本框和数据网格的wpf窗口。 文本框描述父(类a)对象,数据网格列出“子”的集合(类b =>不是从类a派生的)。 子节点可以继承父节点的值。

例如,如果父(类a)具有属性Foo,则子对象(类b)具有属性Nullable,该属性可以覆盖父级的值或继承父级的值。

现在数据网格应显示灰色值(如果是继承的)或黑色(如果用户覆盖网格单元格中的值)。

不幸地绑定到InheritedText不起作用。有人有任何想法吗?

 <DataGridTemplateColumn.CellTemplate>
      <DataTemplate>
           <UserControls:InheritedTextBoxControl 
                 Text="{Binding Path=?}"
                 InheritedText="{Binding Path=?}" />
      </DataTemplate>
 </DataGridTemplateColumn.CellTemplate>

提前致谢 托比

- UPDATE -

InheritedTextBoxControl的xaml:

<UserControl x:Class="Com.QueoMedia.CO2Simulationstool.WPF.Utils.UserControls.InheritedTextBoxControl"
         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"
         mc:Ignorable="d"
         Width="Auto"
         Height="Auto"
         Name="cnt">

<Grid x:Name="LayoutRoot"
      Background="White">
    <TextBox TextChanged="TextBoxTextChanged"></TextBox>
    <TextBlock Name="inheritedText"
               IsHitTestVisible="False"
               Margin="4,0"
               VerticalAlignment="Center"
               Opacity="0.5"
               FontStyle="Italic"></TextBlock>
</Grid>

代码隐藏:

public partial class InheritedTextBoxControl : UserControl {

    private bool _isInherited;

    public static readonly DependencyProperty InheritedTextProperty = DependencyProperty.Register("InheritedText", typeof(String), typeof(InheritedTextBoxControl), new PropertyMetadata(""));
    public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(InheritedTextBoxControl), new PropertyMetadata(default(string)));

    public InheritedTextBoxControl() {
        InitializeComponent();
    }

    public string InheritedText {
        get { return (string)GetValue(InheritedTextProperty); }
        set {
            SetValue(InheritedTextProperty, value);
            inheritedText.Text = value;
        }
    }

    private bool IsInherited {
        get { return _isInherited; }
        set {
            _isInherited = value;
            if (value) {
                inheritedText.Opacity = 0.5;
            } else {
                inheritedText.Opacity = 0;
            }
        }
    }

    public string Text {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    private void TextBoxTextChanged(object sender, TextChangedEventArgs e) {
        if (((TextBox)sender).Text.Length > 0) {
            IsInherited = false;

        } else {
            IsInherited = true;
        }
        Text = ((TextBox)sender).Text;
    }
}

2 个答案:

答案 0 :(得分:0)

问题是InheritedText属性的设置者。当从XAML设置属性时,WPF不会调用此setter。有关详细信息,请参阅Checklist for Defining a Dependency Property实施“包装器”部分。

您必须在PropertyChangedCallback中更新inheritedText.Text,如下所示:

public static readonly DependencyProperty InheritedTextProperty =
    DependencyProperty.Register(
        "InheritedText", typeof(string), typeof(InheritedTextBoxControl),
        new PropertyMetadata(string.Empty, InheritedTextChanged));   

private static void InheritedTextChanged(
    DependencyObject d,
    DependencyPropertyChangedEventArgs e)
{
    ((InheritedTextBoxControl)d).inheritedText.Text = (string)e.NewValue;
}

public string InheritedText
{ 
    get { return (string)GetValue(InheritedTextProperty); } 
    set { SetValue(InheritedTextProperty, value); } // only call SetValue here
} 

答案 1 :(得分:0)

如果有人对解决方案感兴趣:

我们使用包含CustomControl名称MaskedTextbox的CellTemplate来完成它,该名称具有三个属性(MaskedText,Text,IsMaskTextVisible)和CellEditingTemplate来覆盖数据。

值绑定到InheritableValueViewModel。

托比