0

在我看来,我有一个TextBlock控件,它Width取决于Text属性。

我正在寻找某种方法将 TextBlocks 绑定Width到模型中的属性,其工作方式如下:

  1. 的设置Width必须基于自动完成Text
  2. 在我的按钮单击中,我想检索宽度

我已经尝试过下面的代码,但如果我没有在视图模型的构造函数中明确设置它,它会保持为Width0。试过但没有区别,有什么建议吗?Mode=OneWayToSourceMode=OneWay

看法:

<Grid>
    <TextBlock Text="Some text" Width="{Binding TextWidth,Mode=OneWayToSource}" />
    <Button Content="Show Width" Height="30" Width="90" Command="{Binding ShowTextWidth}" />
</Grid>

查看型号:

public event PropertyChangedEventHandler PropertyChanged;

public void OnPropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

private DelegateCommand<object> showTextWidth;
public DelegateCommand<object> ShowTextWidth
{
    get { return showTextWidth; }
    set { showTextWidth = value; }
}

private double textWidth;
public double TextWidth
{
    get { return textWidth; }
    set 
    { 
        textWidth = value;
        OnPropertyChanged("TextWidth");
    }
}

public ViewModel()
{
    //If I explicitly specify the width it works:
    //TextWidth = 100;
    ShowTextWidth = new DelegateCommand<object>(ShowWidth);
}

private void ShowWidth(object parameter)
{
    MessageBox.Show(TextWidth.ToString());
}

}

4

4 回答 4

2

最终由 Maleak创建了一个附加行为,其灵感来自 Kent Boogaarts 将只读 GUI 属性推回 ViewModel,无法相信将 ActualWidth 的值推入视图模型是如此复杂!

于 2013-02-01T10:52:50.997 回答
1

Width 是 TextBlock 上的 DependencyProperty。在这种情况下,它是绑定的目标,而 TextWidth 是绑定的源。OneWayToSource 似乎是要走的路,您在 ViewModel 中将 TextWidth 设置为 100,它不会传播到 TextBlock 上的 Width 因为它是 OneWayToSource 是正确的,然后 Width(Target)将 TextWidth(Source)设置为 Double.NaN 因为 OneWayToSource 和这就是为什么你看到0 ...

ActualWidth 应该像 sa_ddam213 所说的那样工作,但也要考虑到 TextBlock 在 Text 更改时不会在 Width (ActualWidth) 上增长,因为它跨越了 Grid 布局的总宽度。将其放在 ColumnDefinition 中,并将 Width 设置为 Auto 或使您的 Horizo​​ntalAlignment Left 以在 Text 更改时查看 ActualWidth 更改。

我对您的源代码进行了一些更改。考虑在您的按钮上使用 CommandParameter?看看链接...

WpfApplication10.zip

于 2013-02-01T06:54:10.860 回答
0

如果您选择可以为您处理的布局面板,您实际上不需要设置宽度。

例如。width=auto 的 columndefinition 会随着您的文本而增长

于 2013-02-01T07:14:21.753 回答
0

要根据包含的 Text 设置宽度,您可以将 Width-Property 绑定到 Text-Property 并使用如下转换器:

<TextBlock Width="{Binding RelativeSource={RelativeSource Self}, Path=Text, Converter={StaticResource TextToWidth}}"

您的转换器可能如下所示:

TextBlock tb = new TextBlock();
tb.Text = value.ToString();
tb.Measure(new Size(int.MaxValue, 20)); //20 if there shouldnt be a linebreak
return tb.DesiredSize.Width;
于 2013-02-01T07:17:05.700 回答