gpt4 book ai didi

c# - 如何使用子绑定(bind)中的父内容控件?

转载 作者:行者123 更新时间:2023-12-03 11:00:55 25 4
gpt4 key购买 nike

我目前有以下代码:

<DataTemplate DataType="{x:Type vm:SectionViewModel}">
<ScrollViewer>
<ItemsControl ItemsSource="{Binding ViewModels}">
</ItemsControl>
</ScrollViewer>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:StringViewModel}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<Label Name="Left" Grid.Row="0" Grid.Column="0" Content="{Binding Label}"/>
<TextBox Name="Right" HorizontalAlignment="Stretch" Grid.Row="0" Grid.Column="1" Text="{Binding Value}"/>
</Grid>
</DataTemplate>

绑定(bind)到 SectionViewModel ItemsControl 的 ViewModels 属性是 StringViewModel 的列表。我想将每个 StringViewModel 插入到 ItemsControl 中的某种内容控件中。目前我只有每个 StringViewModel 来制作自己的网格,但这会使事情变得不对齐。我想将这些项目插入到 ItemsControl 中的某种内容控件中,它不一定是网格,但它应该在 ItemsControl 中。我怎样才能做到这一点?我也在关注 MVVM,使用 MVVM Light。

编辑:我修改了 XAML 以反射(reflect)我当前的设置方式。

最佳答案

如果要控制包含模板的宽度,可以使用继承的附加属性:

public class WidthInformation
{
// Use propa snippet to create LabelWidth property with this metadata:
... RegisterAttached("LabelWidth", typeof(double), typeof(WidthInformation), new FrameworkPropertyMetadata
{
Inherits = true
});
}

它会这样使用:
<DataTemplate DataType="{x:Type vm:SectionViewModel}">      
<ScrollViewer>
<ItemsControl ItemsSource="{Binding ViewModels}"
local:WidthInformation.LabelWidth="60" />
</ScrollViewer>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:StringViewModel}">
<DockPanel>
<Label Content="{Binding Label}"
Width="{Binding Path=(local:WidthInformation.LabelWidth)"/>
<TextBox Text="{Binding Value}"/>
</DockPanel>
</DataTemplate>

使用 DockPanel 将导致 TextBox 宽度自动填充剩余空间。

另一方面,如果您希望两列相对于彼此具有相同的百分比大小,则可以在列上使用星号大小:
<DataTemplate DataType="{x:Type vm:StringViewModel}">      
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="3*" />
</Grid.ColumnDefinitions>
<Label Content="{Binding Label}" />
<TextBox Text="{Binding Value}" Grid.Column="1" />
</DockPanel>
</DataTemplate>

一个非常简单的解决方案是在 DockPanel 内硬编码宽度,而不是使用附加属性:
<DataTemplate DataType="{x:Type vm:StringViewModel}">      
<DockPanel>
<Label Content="{Binding Label}" Width="80" />
<TextBox Text="{Binding Value}"/>
</DockPanel>
</DataTemplate>

最后,如果您需要根据标签大小调整宽度,您可以使用共享大小的网格:
<DataTemplate DataType="{x:Type vm:SectionViewModel}">      
<ScrollViewer>
<ItemsControl ItemsSource="{Binding ViewModels}"
Grid.IsSharedSizeScope="true" />
</ScrollViewer>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:StringViewModel}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="Label" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Content="{Binding Label}" />
<TextBox Text="{Binding Value}" Grid.Column="1" />
</DockPanel>
</DataTemplate>

WPF 充满了可能性!

关于c# - 如何使用子绑定(bind)中的父内容控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2631195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com