我有一个ItemsControl如下。我想在其中添加不同的UserController。我为此创建了一个数据模板。我正在将我的项添加到我绑定在ViewModel中的ToolItems中。但是UserControl的DataContext正在变空。由于UserControl中的所有内容都依赖于绑定,因此它会进行空插入。不幸的是,我不明白为什么。
<ItemsControl ItemsSource="{Binding ToolItems}"
HorizontalAlignment="Left"
VerticalAlignment="Top">
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type controlsViewModel:TextControlViewModel}">
<controls:TextControl/>
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas MouseMove="Canvas_MouseMove"
Width="100"
Height="100"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left"
Value="{Binding Path=Position.X}" />
<Setter Property="Canvas.Top"
Value="{Binding Path=Position.Y}" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
主视图模型
public ObservableCollection<ViewModelBase> ToolItems
{
get => _toolItems;
set => SetProperty(ref _toolItems, value);
}
private void AddTool(object param)
{
TextControlProperties properties = new TextControlProperties()
{
Description = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.",
Width = 150,
DescriptionWidth = 300,
Margin = new Thickness(50),
Height = 46,
HelperText = "Helper Text",
ParameterName = "Test",
ControlStyle = (Style)Application.Current.Resources["MaterialDesignFloatingHintTextBox"],
};
switch (SelectedToolType.Type)
{
case ControlType.Text:
var item = new TextControlViewModel();
item.Properties = properties;
ToolItems.Add(item);
break;
}
}
UserControl.xaml
<UserControl.DataContext>
<controlViewModel:TextControlViewModel />
</UserControl.DataContext>
<UserControl.Resources>
<converters:NullOrEmptyOrWhiteSpaceVisibilityConverter x:Key="NullOrEmptyOrWhiteSpaceVisibilityConverter" />
</UserControl.Resources>
<Grid>
<StackPanel Margin="{Binding Properties.Margin}"
Canvas.Left="{Binding Position.X}"
Canvas.Top="{Binding Position.Y}">
<TextBlock Text="{Binding Properties.Title}"
FontSize="{Binding Properties.TitleFontSize}"
Visibility="{Binding Properties.Title, Converter={StaticResource NullOrEmptyOrWhiteSpaceVisibilityConverter}}"
Style="{StaticResource MaterialDesignSubtitle2TextBlock}"
HorizontalAlignment="Left" />
<TextBlock Text="{Binding Properties.Description}"
FontSize="{Binding Properties.DescriptionFontSize}"
Opacity="0.7"
Visibility="{Binding Properties.Description, Converter={StaticResource NullOrEmptyOrWhiteSpaceVisibilityConverter}}"
TextWrapping="Wrap"
MaxWidth="{Binding Properties.DescriptionWidth}"
HorizontalAlignment="Left" />
<TextBox ToolTip="{Binding Properties.ParameterName}"
Width="{Binding Properties.Width}"
Height="{Binding Properties.Height}"
FontSize="{Binding Properties.FontSize}"
materialDesign:TextFieldAssist.PrefixText="{Binding Properties.PrefixText}"
materialDesign:TextFieldAssist.SuffixText="{Binding Properties.SuffixText}"
materialDesign:HintAssist.Hint="{Binding Properties.Title}"
materialDesign:HintAssist.HelperText="{Binding Properties.HelperText}"
materialDesign:HintAssist.HelperTextFontSize="{Binding Properties.HelperTextFontSize}"
Style="{Binding Properties.ControlStyle}"
IsReadOnly="True"
HorizontalAlignment="Left">
</TextBox>
</StackPanel>
</Grid>
UserControlViewModel
public class TextControlViewModel : ViewModelBase
{
private TextControlProperties _properties;
public TextControlProperties Properties
{
get => _properties;
set => SetProperty(ref _properties, value);
}
private Point position;
public Point Position
{
get { return position; }
set { position = value; OnPropertyChanged("Position"); }
}
public TextControlViewModel()
{
}
}
我不知道为什么,但是我的UserControlViewModel出现了两次。
1条答案
按热度按时间xkftehaa1#
问题的根源其实很简单。即使我已经在MainViewModel中绑定了DataContext,我还是在UserControl.xaml中再次创建了它。第二个是创建一个null控件。当我在UserControl.xaml中删除下面的代码时,它被修复了。