Silverlight如何在Data Grid列模板中绑定我的用户控件

| 今天,我在尝试做事时变得疯狂,我认为这很简单。 我希望能够创建用户控件,并在我的数据网格的列模板中使用它 我已经搜索并尝试了几种组合,但似乎没有任何效果 谁能帮我?
public class User
{
    public string Name { get; set; }
    public bool IsValid { get; set; }
}

partial class MyControl : UserControl
{
    private string _value;
    public string Value
    {
        get { return _value; }
        set { _value = value;
            txt.Text = value;
        }
    }
    public MyControl()
    {
        InitializeComponent();
    }
}
<Grid x:Name=\"LayoutRoot\" Background=\"White\">
    <TextBlock x:Name=\"txt\" Text=\"[undefined]\"></TextBlock>
</Grid>
public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();

        var items = new List<User>();
        items.Add(new User{Name = \"user 1\", IsValid = true});
        items.Add(new User { Name = \"user 2\", IsValid = false });

        myGrid.ItemsSource = items;

    }
}
<Grid x:Name=\"LayoutRoot\" Background=\"White\">

    <sdk:DataGrid x:Name=\"myGrid\" AutoGenerateColumns=\"False\" IsReadOnly=\"True\">
        <sdk:DataGrid.Columns>
            <sdk:DataGridTemplateColumn Header=\"Name\">
                <sdk:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <SilverlightApplication1:MyControl Value=\"{Binding Name}\"></SilverlightApplication1:MyControl>
                        <!--<TextBlock Text=\"{Binding Name}\"></TextBlock>-->
                    </DataTemplate>
                </sdk:DataGridTemplateColumn.CellTemplate>
            </sdk:DataGridTemplateColumn>

        </sdk:DataGrid.Columns>
    </sdk:DataGrid>

</Grid>
编辑: 我也尝试了以下方法,但是在网格上没有任何结果:
<Grid x:Name=\"LayoutRoot\" Background=\"White\">
    <TextBlock x:Name=\"txt\" Text=\"{Binding Value}\"></TextBlock>
</Grid>
   public partial class MyControl : UserControl
    {
    public DependencyProperty ValueProperty =
        DependencyProperty.Register(\"Value\",
        typeof(string),
        typeof(MyControl),
         new PropertyMetadata(OnValueChanged));


    public string Value
    {
        get
        {
            return (string)GetValue(ValueProperty);
        }
        set
        {
            SetValue(ValueProperty, value);
            NotifyPropertyChanged(\"Value\");
        }
    }

    private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((MyControl) d).Value = (String)e.NewValue; //ERROR: here I got always empty string
    }

    public MyControl()
    {
        InitializeComponent();
    }
}
    
已邀请:
您的第一个代码不起作用的原因很简单。为了能够将\“ Value \”属性绑定到\“ MyControl \”(
Value={Binding Name}
)上,它必须是一个依赖项属性。您在第二段代码中修复了该问题。 这是我所做的(效果很好):
<UserControl x:Class=\"BusinessApplication8_SOF_Sandbox.Controls.MyControl\"
             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:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"
             mc:Ignorable=\"d\"
             d:DesignHeight=\"300\" d:DesignWidth=\"400\" Name=\"myControl\">
    <Grid x:Name=\"LayoutRoot\" Background=\"White\">
        <TextBlock Name=\"textBlock\" Text=\"{Binding Value, ElementName=myControl}\"/>
    </Grid>
</UserControl>
其余的,我用了你的代码。 另一种可能是可以的,如果只希望数据沿一个方向流动(从源到目标的“单向”),使用
TextBlock
控件时就是在其中更新update9ѭ属性。 \“ OnValueChanged \”。这是Value属性的代码:
public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register(\"Value\", typeof(string), typeof(MyControl),
            new PropertyMetadata(\"\", OnValueChanged));
public string Value
{
   get { return (string)GetValue(ValueProperty); }
   set { SetValue(ValueProperty, value); }
}
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
   var target = (MyControl)d;
   var oldValue = (string)e.OldValue;
   var newValue = target.Value;
   target.OnValueChanged(oldValue, newValue);
}
protected virtual void OnValueChanged(string oldValue, string newValue)
{
    textBlock.Text = newValue;
} 
您可以删除xaml中的绑定:
<TextBlock Name=\"textBlock\" />
这也为我工作。 希望这可以帮助 ;)     
您需要在您的User类中实现INotifyPropertyChanged接口,以便绑定的用户控件知道任何绑定属性是否发生更改。请参阅下面的页面,详细了解如何实现它:http://www.silverlightshow.net/tips/How-to-implement-INotifyPropertyChanged-interface.aspx 如您所见,您需要实现接口,并在设置方法中引发事件OnPropertyChanged 然后它将与您的绑定一起使用。 最好, 提姆     

要回复问题请先登录注册