WPF绑定到Grid.ColumnSpan

5

我在一个WPF网格视图中有两个文本框。如果没有要显示的文本,第二个文本框将使用视图模型上的方法(GetNoteTwoVisibility)隐藏 - 没有问题。但是在这种情况下,我想更改第一个文本框的列跨度以使用两个列。我尝试添加一个“GetNoteOneColumnSpan”方法(返回int),但这并不起作用。

<TextBox Name="Note1" Grid.Column="0" Text="{Binding NotesView.NoteOne}" Grid.ColumnSpan="{Binding NotesView.GetNoteColumnSpan}" />
<TextBox Name="Note2" Grid.Column="1" Text="{Binding NotesView.NoteTwo}" Visibility="{Binding NotesView.GetNoteTwoVisibility}" />

有没有办法实现这个?谢谢。
1个回答

8
你不需要为 Grid.ColumnSpan 添加另一个绑定属性。你可以尝试像这样做:
<TextBox Name="Note1"
          Grid.Column="0"
          Text="{Binding NotesView.NoteOne}">
  <TextBox.Style>
    <Style TargetType="{x:Type TextBox}">
      <Setter Property="Grid.ColumnSpan"
              Value="1" />
      <Style.Triggers>
        <DataTrigger Binding="{Binding NotesView.GetNoteTwoVisibility}"
                      Value="False">
          <Setter Property="Grid.ColumnSpan"
                  Value="2" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </TextBox.Style>
</TextBox>
<TextBox Name="Note2"
          Grid.Column="1"
          Text="{Binding NotesView.NoteTwo}"
          Visibility="{Binding NotesView.GetNoteTwoVisibility}" />

非常感谢,这个完美地运行了(一旦我记起我的Visibility方法返回的是一个Visibility枚举而不是一个布尔值!)。 - Nick
不客气。我希望你在ViewModel中使用System.Windows.Visibility属性有一个理由,而不是在ViewModel中使用bool值并在xaml中使用转换器。 - Viv
没有什么特别的原因,可能只是应用程序编写的方式,不过如果使用转换器更好的话,我会研究一下的。谢谢。 - Nick
有些人争论说System.Windows中的东西不应该出现在ViewModel中,因为这会影响可测试性,而另一些人则认为这样做更方便。我支持第一组哈哈。使用转换器并不需要额外的努力,因为你不必创建一个BooleanToVisibility转换器,它可以直接使用。 - Viv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接