0

今天我在試圖做的時候變得很瘋狂,我的想法很簡單。Silverlight如何在數據網格列模板中綁定我的usercontrol

我想

我已經搜索並嘗試了幾種組合,並沒有出現工作

誰能幫助我能夠創建我的用戶,並在我的DataGrid中使用它在我的專欄的模板?

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(); 
    } 
} 

回答

1

之所以你的第一個代碼沒有工作很簡單。爲了能夠綁定「MyControl」(Value={Binding Name})上的「Value」屬性,它必須是依賴屬性。你在第二個代碼中修復了這個問題。

這裏就是我所做的(並且運作良好):

<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控件的情況就是更新Text屬性在「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" /> 

這個工作對我來說也是如此。

希望這有助於;)

+0

謝謝,非常感謝。完美的作品 – muek 2011-05-02 14:39:02

0

需要實現INotifyPropertyChanged接口您的用戶類,以便綁定的用戶控件知道綁定的屬性是否有變化。請參見以下頁面的細節如何實現它:http://www.silverlightshow.net/tips/How-to-implement-INotifyPropertyChanged-interface.aspx

正如你可以看到你需要實現的接口,並在制定者引發事件OnPropertyChanged

然後,它應該與你的綁定工作。

最佳, 添

+0

嗨,我已經實現,但沒有結果 – muek 2011-05-02 14:35:49

相關問題