2014-10-08 68 views
0

我知道这已被问了好几次,但无论我读了多少个教程,我都无法理解它。我有一个有三个ColumnDefinitions的网格,可以通过两个GridSplitter调整大小。我想要的是它下面的另一个网格,有三个ColumnDefinitions,当顶部网格被调整大小时(与iTunes一样的程序中的UI非常相似),调整大小。我想单独的网格的原因是因为最终,每个网格将是它自己的对象,并将需要拖放属性。这里是我写的Xaml,如果有人想看看我在看什么。WPF基本绑定

<Canvas Width="400" Height="15" Background="AntiqueWhite"> 
     <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="400" Name='Maingrid'> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="140" MinWidth="50"/> 
       <ColumnDefinition Width="116" MinWidth="50"/> 
       <ColumnDefinition Width="144" MinWidth="50"/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="15"/> 
      </Grid.RowDefinitions> 
      <GridSplitter Grid.Column="0" 
      HorizontalAlignment="Right" 
      VerticalAlignment="Stretch" 
      Background="Black" 
      ShowsPreview="True" 
      Width="2" 
      /> 
      <GridSplitter Grid.Column="1" 
      HorizontalAlignment="Right" 
      VerticalAlignment="Stretch" 
      Background="Black" 
      ShowsPreview="True" 
      Width="2" 
      /> 
      <TextBlock Text="Song" Grid.Column="0" Width="30"/> 
      <TextBlock Text="Song" Grid.Column="1" Width="30"/> 
      <TextBlock Text="Song" Grid.Column="2" Width="30"/> 
     </Grid> 
    </Canvas> 

    <Canvas Width="400" Height="15" Background="RosyBrown" Margin="58,168,59,138"> 
     <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="400"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="140" MinWidth="50"/> 
       <ColumnDefinition Width="116" MinWidth="50"/> 
       <ColumnDefinition Width="144" MinWidth="50"/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="15"/> 
      </Grid.RowDefinitions> 
      <TextBlock Text="Song" Grid.Column="0" Width="30"/> 
      <TextBlock Text="Song" Grid.Column="1" Width="30"/> 
      <TextBlock Text="Song" Grid.Column="2" Width="30"/> 
     </Grid> 
    </Canvas> 

而且作为最后一点,我已经看了无穷无尽的教程和指南的数据绑定和我17岁的大脑似乎无法环绕它我的头。如果我能够理解如何将文本块绑定到我的C#代码隐藏中的变量(又名:不在代码隐藏中设置文本块的文本属性,而只是更改字符串的内容),我就能够变得如此之多更高效。谢谢任何能够帮助我的人,我知道这个问题已经被问了一百万次。

+0

你问这里的两个问题,@ hosch250已经回答了第一个,虽然我已经(也许是不好)回答第二 – paul 2014-10-08 15:55:06

+0

别担心,我花了几天(超过一周?)来理解数据绑定,但是当我理解它时,它实现得非常快。一旦你理解了单向绑定,玩了一段时间的双向绑定,学习转换器,你会很好。 – Hosch250 2014-10-08 15:56:56

回答

1

在你的C#代码隐藏,创建一个属性:

private string _songTitle; 
public string SongTitle { get { return _songTitle; } set { songTitle = value; } } 

在XAML中,创建一个绑定:您结合

<TextBlock Text="{Binding SongTitle}" /> 

设置的DataContext(你可以把这个在Window.Loaded事件)

this.DataContext = this; 

在代码中设置你的财产

SongTitle = "Some words and stuff"; 

就是这样。它可以变得更复杂,但这是基础。

+0

NotifyPropertyChange应该实现,如果他希望更改反映在UI中。 – BenjaminPaul 2014-10-08 15:47:16

+0

是的,试图保持简单。 – paul 2014-10-08 15:47:56

0

这是一种无代码的方法。只需给出第一个列定义名称,然后将较低的列定义宽度绑定到第一个网格中相应列定义的宽度。干净和简单,背后惹没有代码:

<Canvas Width="400" Height="15" Background="AntiqueWhite"> 
    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="400" Name='Maingrid'> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Name="Grid1Col1" Width="140" MinWidth="50"/> 
      <ColumnDefinition Name="Grid1Col2" Width="116" MinWidth="50"/> 
      <ColumnDefinition Name="Grid1Col3" Width="144" MinWidth="50"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="15"/> 
     </Grid.RowDefinitions> 
     <GridSplitter Grid.Column="0" 
     HorizontalAlignment="Right" 
     VerticalAlignment="Stretch" 
     Background="Black" 
     ShowsPreview="True" 
     Width="2" 
     /> 
     <GridSplitter Grid.Column="1" 
     HorizontalAlignment="Right" 
     VerticalAlignment="Stretch" 
     Background="Black" 
     ShowsPreview="True" 
     Width="2" 
     /> 
     <TextBlock Text="Song" Grid.Column="0" Width="30"/> 
     <TextBlock Text="Song" Grid.Column="1" Width="30"/> 
     <TextBlock Text="Song" Grid.Column="2" Width="30"/> 
    </Grid> 
</Canvas> 

<Canvas Width="400" Height="15" Background="RosyBrown" Margin="58,168,59,138"> 
    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="400"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="{Binding Width, ElementName=Grid1Col1}" MinWidth="50"/> 
      <ColumnDefinition Width="{Binding Width, ElementName=Grid1Col1}" MinWidth="50"/> 
      <ColumnDefinition Width="{Binding Width, ElementName=Grid1Col1}" MinWidth="50"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="15"/> 
     </Grid.RowDefinitions> 
     <TextBlock Text="Song" Grid.Column="0" Width="30"/> 
     <TextBlock Text="Song" Grid.Column="1" Width="30"/> 
     <TextBlock Text="Song" Grid.Column="2" Width="30"/> 
    </Grid> 
</Canvas>