将DataContext绑定到自定义Control

时间:2015-06-01 12:46:33

标签: c# wpf binding

我正在尝试在放置在DataGridTemplateColumn中的customcontrol中绑定一个值,但绑定似乎不起作用。

我的DataGridTemplateColumn:

<DataGridTemplateColumn Width="auto" SortMemberPath="Etat" CanUserReorder="False" CanUserResize="True" x:Name="colonneEtat">
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate />
                    </DataGridTemplateColumn.CellEditingTemplate>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <widget:MyWidget MyObject="{Binding MyObjectVariable, Converter={StaticResource MyDebugConverter}}" Margin="5,0" VerticalAlignment="Center"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

我的自定义控件现在只包含一个Grid,但它的属性定义如下:

public static readonly DependencyProperty MyObjectProperty=
            DependencyProperty.Register("MyObject",
            typeof(ObjectType),
            typeof(MyWidget),
            new PropertyMetadata(null));
public ObjectType MyObject
        {
            get { return (ObjectType)GetValue(MyObjectProperty); }
            set { 
                SetValue(MyObjectProperty, value);
                FillCustomControl();
            }
        }

Debug Converter只是一个用于测试绑定的虚拟转换器:

public object Convert(object value, Type targetType,
               object parameter, CultureInfo culture)
        {
            System.Diagnostics.Debugger.Break();
            return value;
        }

我的自定义控件工作正常,我已经在我的应用程序的另一个地方尝试过了。它的功能很简单:当设置属性时,我根据属性中的内容填充自定义控件。如上所述,这种行为已经过测试。

但是在这个DataGridTemplateColumn的情况下,永远不会设置该属性。输出中没有任何绑定错误,调试器在转换器中停止+转换器中的值是预期值。但由于某种原因,它没有在我的自定义控件中设置属性的值。

我错过了什么?

谢谢

1 个答案:

答案 0 :(得分:0)

当数据绑定到Request.UserLanguages时,您应该省略PRIMARY KEY (id) 部分,而不是这样:

$linkexists = false;    
foreach ($json as $obj) {
   if ($obj['favouriteLinkContent'] == $favouriteLink) {
    echo json_encode("HELLO");
    $linkexists = true;
   }

}

if(!$linkexists){
   $json[] = array("favouriteLinkContent" => $favouriteLink,
                   "favouriteLinkID" => $favouriteLinkID);
   file_put_contents($file, json_encode($json));
}

你应该用这个:

Property

除非您的DependencyProperty课程中确实有另一个名为<widget:MyWidget ObjectProperty="{Binding MyObject ... }" /> <widget:MyWidget MyObject="{Binding MyObject ...}" /> 的{​​{1}}。此外,根据您的代码,设置为DependencyProperty的{​​{1}}的对象也应具有名为ObjectPropertyProperty的属性。

更新&gt;&gt;&gt;

好的,现在我明白了你的问题。也就是说,与Widget相关的CLR属性的setter是从未调用框架...... CLR属性仅用于您的。如果您想在更改DataContext值时执行某些操作,则需要设置PropertyChangedCallback handler。您可以这样做(来自MSDN上的链接页面):

DataGrid

事实上,您甚至可以忽略MyObject构造函数并将其声明为:

DependencyProperty