Как получить доступ к пользовательскому элементу управления из модели представления в UWP?

#uwp #uwp-xaml

#uwp #uwp-xaml

Вопрос:

У меня есть UWP, в котором у меня есть пользовательский элемент управления, определенный в file1.xaml

 <UserControl>
  <Grid x:Name="A">
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="DemoStates">
            <VisualState x:Name="State1"/>
            <VisualState x:Name="State2">
                <Storyboard
                    x:Name="StoryboardDemo"
                    FillBehavior="HoldEnd">
                    <DoubleAnimationUsingKeyFrames
                        EnableDependentAnimation="True"
                        Storyboard.TargetName="DemoStateChange"
                        Storyboard.TargetProperty="(SomeProperty)">
                    </DoubleAnimationUsingKeyFrames>
                </Storyboard>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <Grid x:Name="StoryboardDemo">
         <Image
            Source="//assets//Image1.jpg"/>
         <Image
            Source="//assets//Image2.jpg"/>
 </UserControl>
  

Я использую этот пользовательский элемент управления внутри другого файла xaml file2.xaml

 <Grid>
     <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <control:file1/>
   <ToggleSwitch
        Grid.Row="1"
        Toggled="{x:Bind ViewModel.ChangeImage}"/>
 </Grid>
  

Если пользователь переключает переключатель на раскадровке, он должен перейти в состояние 2, а если он выключен, он должен перейти в состояние 1.Я пытаюсь управлять этой раскадровкой через модель представления

File2ViewModel.cs

     public void ChangleImage(object sender, RoutedEventArgs e)
    {
        Windows.UI.Xaml.Controls.ToggleSwitch toggleSwitch = sender as Windows.UI.Xaml.Controls.ToggleSwitch;
        if (toggleSwitch != null)
        {
            if (toggleSwitch.IsOn == true)
            {
                VisualStateManager.GoToState(file1 , "state2", false); //get an error for the first parameter
            }
            else
            {
                VisualStateManager.GoToState(file1, "state1", false);//get an error for the first parameter
            }
        }
  

Как мне запустить пользовательский элемент управления для запуска раскадровки из ViewModel? Также, если переключатель переключен, я хотел бы отправить значение для управления «someproperty» обратно пользовательскому элементу управления, чтобы он мог управлять представлением на основе этого, возможно ли этого добиться?

Комментарии:

1. file1 это имя класса, а не объект управления, который вы создали в коде Xaml. Вы могли бы дать usercontrol имя, подобное <local:file1 x:Name="MyControl1"/> . Затем вызовите метод, подобный VisualStateManager.GoToState(MyControl1, "state2", false);

2. Я попытался получить доступ к «Control1», но по-прежнему получаю ошибки в VisualStateManager, в которых говорится, что контекст не найден. У меня есть что-то вроде этого <control:file1 x:Name=»MyControl1″/> и VisualStateManager . GoToState(MyControl1, «state2», false);

Ответ №1:

Я неправильно понял ваш код. Вы помещаете ChangleImage method в ViewModel. Вы можете установить свойство в File2ViewModel и назначить элемент управления этому свойству.

Я сделал простую демонстрацию на основе вашего сценария

File2ViewModel:

  public class File2ViewModel
{
    public file1 thefile { get; set; }

    public File2ViewModel(file1 file)
    {
        thefile = file;
    }

    public void ChangleImage(object sender, RoutedEventArgs e)
    {
        Windows.UI.Xaml.Controls.ToggleSwitch toggleSwitch = sender as Windows.UI.Xaml.Controls.ToggleSwitch;
        if (toggleSwitch != null)
        {
            if (toggleSwitch.IsOn == true)
            {
                VisualStateManager.GoToState(thefile, "state2", false); //get an error for the first parameter
                Debug.WriteLine("test");
            }
            else
            {
                VisualStateManager.GoToState(thefile, "state1", false);//get an error for the first parameter
                Debug.WriteLine("test");
            }
        }
    }
 }
  

В коде file2 за:

  public File2ViewModel viewModel { get; set; }
 viewModel = new File2ViewModel(MyControl1);
  

MyControl1 это элемент управления file1, который вы добавили в file2 xaml.