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

#wpf #xaml #user-controls

#wpf #xaml #пользовательские элементы управления

Вопрос:

У меня есть пользовательский элемент управления. Там у меня есть текстовое поле. Если я задаю какое-либо значение в текстовом поле, то я нажимаю кнопку «Выбрать» в пользовательском элементе управления. что я хочу, так это то, что на моей странице window у меня есть другое текстовое поле. Я хочу привязать текстовое значение, которое уже выбрано в текстовом поле пользовательского элемента управления. У меня есть следующий код. Пользовательский элемент управления:

    <UserControl x:Class="Usercontrol1" x:Name="root">
   <Grid DataContext="{Binding ElementName=root}">
            <TextBox HorizontalAlignment="Right" VerticalAlignment="Center" 
               x:Name="txtAuto" TextWrapping="NoWrap" />
            <Button Name="btn_setectedType" HorizontalAlignment="Right" VerticalAlignment="Center" Content="Select"  Click="btn_setectedType_Click"/>                

   </Grid>
  </UserControl>
  

это страница моего окна..

   <Window x:Class="Window1" Title="Facility" >

      <Grid>
         <TextBox x:Name="txtUserSelection" HorizontalAlignment="Left"  Text="{Binding ???}" VerticalAlignment="Top" />
      </Grid>
 </Window>
  

Я не знаю, как продолжить дальше. я попытался создать объект для этого окна и попытался передать его непосредственно из пользовательского элемента управления. но это не удается. Мое требование заключается в том, что всякий раз, когда я изменяю значение в Usercontrol, значение должно привязываться к текстовому полю в Window. Кто-нибудь может, пожалуйста, помочь?

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

1. Я чувствую, что вам нужно уйти и лучше изучить WPF, прежде чем вы вернетесь сюда, чтобы задавать вопросы… проблема в том, что вы, похоже, знаете недостаточно даже для того, чтобы понять ответы, которые вам предоставили, и это не тот веб-сайт, на который вы можете прийти, чтобы выучить язык… это ваша работа.

Ответ №1:

Вы должны создать ViewModel, который содержит свойство, которое вы хотите совместно использовать между элементами управления, и установить его в качестве DataContext как для вашего MainWindow, так и для вашего UserControl . Затем вы должны привязать оба этих текстовых поля к этому свойству.

Пример ViewModel:

 public class MyViewModel : INotifyPropertyChanged {
    public string MyProperty {
        get { return _myProperty; }
        set { _myProperty = value; OnPropertyChanged("MyProperty");}
    }
}
  

И использовать его в XAML:

 <Window [...]>
    <Window.DataContext>
         <local:MyViewModel/>
    </Window.DataContext>
    <TextBox Text="{Binding MyProperty}"/>
    <UserControl1 />
  

Здесь для вашего UserControl1 уже будет установлено значение DataContext, совпадающее с значением Window, и вы можете просто зеркально отобразить привязку из текстового поля. Вы не указываете, где создается ваш UserControl, поэтому я не могу быть более конкретным, чем это.

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

1. Я новичок в wpf. Не могли бы вы поделиться какой-либо ссылкой для этого? или не могли бы вы привести какой-нибудь пример для этого?

2. Я обновил ответ. Если вам все еще нужны уточнения, пожалуйста, не стесняйтесь спрашивать. Но мне не хватает ключевого компонента в предоставленном рабочем ответе: где вы используете свой UserControl1?

3. Честно говоря, я не совсем понимаю, где я могу использовать эту модель представления. я использую свой пользовательский элемент управления только в том же приложении.

4. Вы можете использовать эту ViewModel везде, где это DataContext. В моем примере это означает, что в любом месте вашего окна. ‘{Привязка MyProperty}’ означает ‘покажите мне значение свойства MyProperty для объекта, который задан как DataContext’. Я бы настоятельно рекомендовал ознакомиться с привязками в WPF, если вы не знаете, что такое DataContext.

Ответ №2:

Добавьте string свойство в свой MainWindow код за:

 public static readonly DependencyProperty StringValueProperty = DependencyProperty.
    Register("StringValue", typeof(string), typeof(MainWindow), 
    new UIPropertyMetadata("Some default value"));

public string StringValue
{
    get { return (string)GetValue(StringValueProperty); }
    set { SetValue(StringValueProperty, value); }
}
  

Затем вы можете привязать данные из вашего UserControl файла непосредственно к этому свойству, используя MainWindow.xaml.cs , вот так:……….. RelativeSource Binding :

 <TextBox x:Name="txtUserSelection" Text="{Binding StringValue, RelativeSource={
    RelativeSource AncestorType={x:Type Window}}, Mode=TwoWay}" />
  

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

1. что это за код в пользовательском элементе управления? там у меня есть кнопка выбора. после нажатия только этой кнопки мое текстовое значение из пользовательского элемента управления будет привязано в моем главном окне