我在其父窗口的框架内有一个UserControl。在usercontrol中,我有一个文本框,需要在切换父窗口上的按钮时进行编辑。
UserControl.xaml
<UserControl.Resources>
<ResourceDictionary>
<Style x:Key="TextBoxEdit" TargetType="TextBox">
<Setter Property="IsReadOnly" Value="True" />
<Style.Triggers>
<DataTrigger Binding="{Binding CanEdit}" Value="True">
<Setter Property="IsReadOnly" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<TextBox
x:Name="EditTextBox"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Style="{StaticResource TextBoxEdit}"
Text="Edit me" />
</Grid>
MainWindow.xaml
<Controls:MetroWindow.DataContext>
<local:ViewModel/>
</Controls:MetroWindow.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<ToggleButton x:Name="EditButton" HorizontalAlignment="Center" VerticalAlignment="Top" IsChecked="{Binding CanEdit}">Edit</ToggleButton>
<Frame Grid.Row="1" Source="Home.xaml" />
</Grid>
视图模型
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private bool canEdit;
public bool CanEdit
{
get { return canEdit; }
set
{
canEdit = value;
OnPropertyChanged("CanEdit");
}
}
private void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
如何让数据触发器正常工作?是为usercontrol创建另一个视图模型然后在两个视图模型之间传递值的最佳方法吗?如果是这样,我该怎么做?
答案 0 :(得分:0)
是为usercontrol创建另一个视图模型然后在2个视图模型之间传递值的最佳方法吗?
最常见的方法是让UserControl
简单地继承父窗口的DataContext
,这样它们就可以绑定到同一个属性。
但是,当您使用Frame
时,这不是开箱即用的。
您可以将Frame
替换为ContentControl
:
<ToggleButton x:Name="EditButton" IsChecked="{Binding CanEdit}">Edit</ToggleButton>
<ContentControl>
<local:Home />
</ContentControl>
或者,您可以处理DataContextChanged
的{{1}}事件,并按照@Joe White的建议明确设置其Frame
DataContext
:page.DataContext not inherited from parent Frame?