我有2个用户控件。 Usercontrol 1:菜单栏,其中包含添加,编辑,删除,保存和撤消等按钮。 Usercontrol 2:用户可以在文本框和密码箱中输入文本的屏幕
但是当我想要保存的时候我习惯做以下事情,因为我只有1个usercontrol,它有按钮和所有东西,而不是菜单栏和详细信息屏幕分开:
<Button Style="{DynamicResource SaveButton}" Command="{Binding Path=SaveCommand}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource pwConverter}">
<Binding ElementName="txtPassword" />
<Binding ElementName="txtRepeatPassword" />
</MultiBinding>
</Button.CommandParameter>
</Button>
但是现在该范围内不存在元素名称“txtPassword”和“txtRepeatPassword”。 单击保存按钮时,这是我的SaveCommand。它接收这两个参数,所以我可以检查2个密码是否相同,以及类似的东西。
private void SaveUserExecute(object passwords)
{
try
{
var passwordvalues = (object[])passwords;
PasswordBox passwordBox1 = (PasswordBox)passwordvalues[0];
PasswordBox passwordBox2 = (PasswordBox)passwordvalues[1];
...
有关如何解决此问题的任何想法?
答案 0 :(得分:0)
因为我的2个usercontrols共享了相同的DataContext,所以我创建了2个代表我的PasswordBoxes的属性。当我初始化该视图时,我执行了以下操作:
public InputUserView()
{
InitializeComponent();
this.DataContext = InputUserViewModel.Instance;
InputUserViewModel.Instance.PasswordBox1 = txtPassword;
InputUserViewModel.Instance.PasswordBox2 = txtRepeatPassword;
}
所以现在我的viewmodel知道这2个密码盒。我认为这不是那么好,但它适用于我,我可以忍受它
答案 1 :(得分:0)
如果使用MVVM模式,这很容易。您可以拥有一个ViewModel,它可以是每个用户控件和主窗口的DataContext。然后只需绑定到每个属性上的属性。
以下是ViewModel的示例,它包含我们可以绑定到的属性公开的字段:
public class ViewModel : INotifyPropertyChanged
{
private readonly Command _command;
public Command Command
{
get { return _command; }
}
public ViewModel()
{
_command = new Command(this);
}
private string _textBoxOnUserControlOne;
private string _textBoxOnUserControlTwo;
public string TextBoxOnUserControlOne
{
get { return _textBoxOnUserControlOne; }
set
{
if (value == _textBoxOnUserControlOne) return;
_textBoxOnUserControlOne = value;
OnPropertyChanged("TextBoxOnUserControlOne");
}
}
public string TextBoxOnUserControlTwo
{
get { return _textBoxOnUserControlTwo; }
set
{
if (value == _textBoxOnUserControlTwo) return;
_textBoxOnUserControlTwo = value;
OnPropertyChanged("TextBoxOnUserControlTwo");
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
这是命令类,我将使用这两个属性:
public class Command : ICommand
{
private readonly ViewModel _viewModel;
public Command(ViewModel viewModel)
{
_viewModel = viewModel;
}
public void Execute(object parameter)
{
var dataOnControlOne = _viewModel.TextBoxOnUserControlOne;
var dataOnControlTwo = _viewModel.TextBoxOnUserControlTwo;
//Use these values
}
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged;
}
现在,这是我的第一个用户控件1绑定到我的ViewModel上的一个字段,请注意DataContext:
<UserControl ... DataContext="{StaticResource ViewModel}">
<Grid>
<TextBox Height="23" HorizontalAlignment="Left" Text="{Binding TextBoxOnUserControlOne}" Margin="12,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
</Grid>
</UserControl>
这是第二个具有相同DataContext的UserControl,文本框绑定到不同的属性:
<UserControl ... DataContext="{StaticResource ViewModel}">
<Grid>
<TextBox Height="23" HorizontalAlignment="Left" Text="{Binding TextBoxOnUserControlTwo}" Margin="12,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
</Grid>
</UserControl>
这是我的主窗口,其中包含这些用户控件和绑定到命令类的按钮:
<Window ... DataContext="{StaticResource ViewModel}">
<Grid>
<my:UserControl1 HorizontalAlignment="Left" Margin="160,69,0,0" x:Name="userControl11" VerticalAlignment="Top" Height="47" Width="155" />
<my:UserControl2 HorizontalAlignment="Left" Margin="160,132,0,0" x:Name="userControl12" VerticalAlignment="Top" Height="48" Width="158" />
<Button Content="Button" Command="{Binding Command}" Height="23" HorizontalAlignment="Left" Margin="199,198,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
</Grid>
</Window>
最后是我的App.Xaml课程,将所有内容粘合在一起:
<Application ...>
<Application.Resources>
<wpfApplication4:ViewModel x:Key="ViewModel"/>
</Application.Resources>
</Application>
这里,我们有单独的用户控件,并且字段绑定到一个视图模型上的属性。此视图模型将自身传递到命令类,然后命令类可以访问单独用户控件上的文本框绑定的属性,并在按下按钮时使用它们。我希望这有帮助!