2

次の単純なコードについて考えてみます。


XAML:

<Grid Height="60" Name="grid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="162*" />
        <ColumnDefinition x:Name="coltest" Width="316*" />
        <ColumnDefinition Width="239*" />
    </Grid.ColumnDefinitions>
</Grid>
<Label MouseDoubleClick="TextBox_MouseDoubleClick" 
    Content="{Binding ElementName=coltest, Path=ActualWidth}" Grid.Row="1"/>

MouseDoubleClickイベント:

private void TextBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    grid.RowDefinitions.Add(new RowDefinition());
    for (int i = 0; i < grid.ColumnDefinitions.Count; i++)
    {
        Random r = new Random();
        Label l = new Label { Content = r.Next(10, 1000000000).ToString() };
        grid.Children.Add(l);
        Grid.SetRow(l, grid.RowDefinitions.Count - 1);
        Grid.SetColumn(l, i);
    }
}

私のラベルにはActualWidth、バインディングを介して2番目の列のプロパティが含まれています。Visual Studioで、値316を含むラベルが表示されるので、バインドは機能します。

ラベルをダブルクリックすると、そのイベントがトリガーされ、グリッドにランダムな長さの行が追加されます。

ラベルに新しい値が表示されることを期待していますが、(実行時に計算された)0は変更されません!

ここで何が欠けていますか?

4

1 に答える 1

4

主な問題はActualWidth、aColumnDefinitionが依存関係プロパティではなく、実装されていないINotifyPropertyChangedため、coltestのが変更されBindingたことを知る方法がないことです。ActualWidth

明示的に更新する必要がありますBinding

Edit2:この場合、幅があるので、BindingイベントSizeChangedでを更新できる可能性があります。幅はの要素に基づいて変化するため、これは幅で100%機能しません。GridColumns*AutoColumnDefinition

<Grid Name="grid"
      SizeChanged="grid_SizeChanged">
    <!--...-->
</Grid>

イベントハンドラ

void grid_SizeChanged(object sender, SizeChangedEventArgs e)
{
    BindingExpression be = label.GetBindingExpression(Label.ContentProperty);
    be.UpdateTarget();
}

編集: Xamlにいくつかの小さな変更を加えました。Bindingこれは、最初にダブルクリックするたびに更新されますLabel

<Grid Name="grid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="162*" />
        <ColumnDefinition x:Name="coltest" Width="316*" />
        <ColumnDefinition Width="239*" />
        <ColumnDefinition Width="239*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Label MouseDoubleClick="TextBox_MouseDoubleClick"
           Name="label"
           Content="{Binding ElementName=coltest, Path=ActualWidth}" Grid.Row="0"/>
</Grid>

イベントハンドラ

private void TextBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    grid.RowDefinitions.Add(new RowDefinition());
    for (int i = 0; i < grid.ColumnDefinitions.Count; i++)
    {
        Random r = new Random();
        Label l = new Label { Content = r.Next(10, 1000000000).ToString() };
        grid.Children.Add(l);
        Grid.SetRow(l, grid.RowDefinitions.Count - 1);
        Grid.SetColumn(l, i);
    }
    BindingExpression be = label.GetBindingExpression(Label.ContentProperty);
    be.UpdateTarget();
}
于 2011-09-13T14:18:02.533 に答える