我已经实现了一个用户控件,我已经将DataContext
绑定到了自己......
this.DataContext = this;
用户控件顶部有一个组合框。关于它的选择改变事件。我正在更新UserControl
的属性,该属性应该会重新生成整个视图,包括TabControl
和TextBoxes
中的一些标签。
在选择更改事件中,我正在更新此属性......
this.CurrentViewModel = viewModel;
以下是视图中的一些示例xaml。
<TextBox
x:Name="txtPageSetupAlias"
Width="500"
Padding="2,5,0,0"
Text="{Binding Path=CurrentViewModel.ValidPageSetupAlias, Mode=TwoWay}"
Style="{StaticResource ResourceKey=txtAlias}" DockPanel.Dock="Left"
/>
<TabControl
x:Name="tcOrientation"
Grid.Row="1"
BorderBrush="Transparent"
BorderThickness="0"
Margin="0,0,0,0"
TabStripPlacement="Top"
ItemsSource="{Binding Path=CurrentViewModel.Orientations}">
并在TabControl中......
<TabControl.ContentTemplate>
<DataTemplate>
<Grid>
<StackPanel
Orientation="Horizontal"
Margin="0,0,0,5">
<TextBlock
Text="Page Width:"
Style="{StaticResource tbDataLabel}"
Margin="0,0,34,0"
/>
<Border
Width="98"
CornerRadius="5"
BorderBrush="#CCCCCC"
Background="White"
BorderThickness="1"
Margin="7,0,0,0"
>
<xctk:DecimalUpDown
x:Name="pageDimWidth"
Value="{Binding Path=PageWidth, Mode=TwoWay, ValidatesOnDataErrors=True, NotifyOnValidationError=True}"
Validation.Error="page_Error" Increment="0.10"
ParsingNumberStyle="Float"
Style="{StaticResource dudValues}"
d:DataContext="{d:DesignInstance dtOs:PageSizeOrientationViewModel}"
/>
更新1:
这是CurrentViewModel
属性
private PageSetupEditorViewModel _currentViewModel;
public PageSetupEditorViewModel CurrentViewModel
{
get { return _currentViewModel; }
set
{
_currentViewModel = value;
OnPropertyChanged(nameof(CurrentViewModel));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
有谁能告诉我这里缺少什么......
更新2: 共享组合选择更改事件:
private void cmbPageSetupTemplate_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
_errors = 0;
var validPageSetup = cmbPageSetupTemplate.SelectedItem as PageSetupEditorViewModel;
CurrentViewModel = viewModel;
this.DataContext = this;
}
答案 0 :(得分:1)
显然,我必须做两件事才能使它发挥作用。
因为我像这样绑定了用户控件......
this.DataContext = this;
我必须在User Control类本身上实现INotifyPropertyChange
并在PropertyChanged
属性上实现CurrentViewModel
调用,如下所示:
private PageSetupEditorViewModel _currentViewModel;
public PageSetupEditorViewModel CurrentViewModel
{
get { return _currentViewModel; }
set
{
_currentViewModel = value;
OnPropertyChanged(nameof(CurrentViewModel));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
但是我没有完全更新视图,因为我使用集合在TabControl
中生成标签。
我必须在选择TabComtrol.Items
的选择更改事件时使用此选项刷新ComboBox
的视图,如下所示:
tcOrientation.Items.Refresh();
这解决了我的问题:)