#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. что это за код в пользовательском элементе управления? там у меня есть кнопка выбора. после нажатия только этой кнопки мое текстовое значение из пользовательского элемента управления будет привязано в моем главном окне