[英]How can I use a parent content control from a sub binding?
我目前有以下代碼:
<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>
綁定到SectionViewModel ItemsControl的ViewModels屬性是StringViewModel的列表。 我想將每個StringViewModel插入ItemsControl中的某種內容控件中。 目前,我只有每個StringViewModel都可以創建自己的Grid,但是這使事情變得無法對齊。 我想將這些項目插入ItemsControl中的某種內容控件中,它不一定必須是網格,但它應該在ItemsControl中。 我怎樣才能做到這一點? 我也正在使用MVVM Light跟蹤MVVM。
編輯:我修改了XAML,以反映當前如何設置它。
如果要控制包含模板中的寬度,可以使用繼承的附加屬性:
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充滿了可能性!
將您的DataTemplate(用於SectionViewModel)更改為使用ListBox代替那里的更通用的控件將是最簡單的。 設置完成后,請更改要附加到ListBox的DataTemplate。
不幸的是,如果不進入更復雜的布局,就沒有真正簡單的方法來設置您要描述的控件。 我建議這樣設置,然后如果您需要為列綁定到某個寬度,請將其附加到父控件(或設置一個確定最大寬度並將其全部綁定到該屬性的屬性)。
<ListBox ItemsSource="{Binding Path=ViewModels}">
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type vm:StringViewModel}">
<StackPanel Orientation="Horizontal">
<Label x:Name="Left" Content="{Binding Label}" Width="{Binding ElementName=SourceControlHere, Path=WidthToBindTo}"/>
<TextBox x:Name="Right" HorizontalAlignment="Stretch" Text="{Binding Value}" Width="{Binding ElementName=SourceControlHere, Path=WidthToBindTo2}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.