Сбой основного класса привязки

Я создал собственный элемент управления в WPF для Windows 10 Apps. Проблема в том, что использование системы ; используя Систему . Коллекции . Общий ; используя Систему . ComponentModel ; используя Систему . Linq ; используя Систему . Время выполнения . CompilerServices ; используя Систему . Текст ; используя Систему . Потоки . Задачи ; используя Windows . Пользовательский интерфейс . Xaml ; используя AppDemo . Аннотации ; namespace AppDemo { public class ViewModel : INotifyPropertyChanged { private String t1 , t2 ; public String T1 { get { return t1 ; } set { t1 = значение ; Concat = T1 + T2 ; } } public String T2 { get { return t2 ; } set { t2 = значение ; Concat = T1 + T2 ; } } private String concat ; public String Concat { get { return concat ; } set { concat = value ; OnPropertyChanged ( nameof ( Concat )); } } публичное событие PropertyChangedEventHandler PropertyChanged ; [ NotifyPropertyChangedInvocator ] protected virtual void OnPropertyChanged ([ CallerMemberName ] string propertyName = null ) { PropertyChanged ?. Invoke ( это , новый PropertyChangedEventArgs ( propertyName )); } } } < UserControl x : Class = "AppDemo.ExampleControl" xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns : x = "http://schemas.microsoft.com/ winfx / 2006 / xaml " xmlns : local = " используя: AppDemo " xmlns : d = " http://schemas.microsoft.com/expression/blend/2008 " xmlns : mc = " http://schemas.openxmlformats.org / markup-compatible / 2006 " mc : Ignorable = " d " d : DesignHeight = " 300 " d : DesignWidth = " 400 " > < Grid Name = " grid " > < StackPanel > < TextBox Text = " {Binding T1, Mode = TwoWay} " /> < TextBox Text = " {Binding T2, Mode = TwoWay} " /> </ StackPanel > </ Grid > </ UserControl > с использованием System ; используя Систему . Коллекции . Общий ; используя Систему . ComponentModel ; используя Систему . IO ; используя Систему . Linq ; используя Систему . Время выполнения . CompilerServices ; используя Систему . Время выполнения . InteropServices . WindowsRuntime ; используя Windows . Фонд ; используя Windows . Фонд . Коллекции ; используя Windows . Пользовательский интерфейс . Xaml ; используя Windows . Пользовательский интерфейс . Xaml . Контроль ; используя Windows . Пользовательский интерфейс . Xaml . Управление . Примитивы ; используя Windows . Пользовательский интерфейс . Xaml . Данные ; используя Windows . Пользовательский интерфейс . Xaml . Вход ; используя Windows . Пользовательский интерфейс . Xaml , СМИ ; используя Windows . Пользовательский интерфейс . Xaml . Навигация ; используя AppDemo . Аннотации ; // Шаблон элемент управления пользователя документирована в https://go.microsoft.com/fwlink/?LinkId=234236 имена AppDemo { общественного запечатаны частичный класс ExampleControl : UserControl { публичный статический чтения DependencyProperty ConcatProperty = DependencyProperty . Register ( «Concat» , typeof ( String ), typeof ( ExampleControl ), новый PropertyMetadata (по умолчанию ( String ))); private ViewModel m ; public String Concat { get { return ( String ) GetValue ( ConcatProperty ); } set { SetValue ( ConcatProperty , значение ); } } public ExampleControl () { this . InitializeComponent (); m = новый ViewModel (); сетка . DataContext = m ; м . PropertyChanged + = M_PropertyChanged ; } private void M_PropertyChanged ( отправитель объекта , PropertyChangedEventArgs e ) { Concat = m . Concat ; } публичное событие PropertyChangedEventHandler PropertyChanged ; [ NotifyPropertyChangedInvocator ] private void OnPropertyChanged ([ CallerMemberName ] string propertyName = null ) { PropertyChanged ?. Invoke ( это , новый PropertyChangedEventArgs ( propertyName )); } } } < Страница x : Class = "AppDemo.MainPage" xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns : x = "http://schemas.microsoft.com/ winfx / 2006 / xaml " xmlns : local = " используя: AppDemo " xmlns : d = " http://schemas.microsoft.com/expression/blend/2008 " xmlns : mc = " http://schemas.openxmlformats.org / markup-compatible / 2006 " mc : Ignorable = " d " > < Grid Background = " {ThemeResource ApplicationPageBackgroundThemeBrush} " > < StackPanel > < local : ExampleControl Concat = " {Binding C} " /> < Button Name = " btnTest " Нажмите = "BtnTest_OnClick" > Тест </ Button > </ StackPanel > </ Сетка > </ Page > с помощью системы ; используя Систему . Коллекции . Общий ; используя Систему . IO ; используя Систему . Linq ; используя Систему . Время выполнения . InteropServices . WindowsRuntime ; используя Windows . Фонд ; используя Windows . Фонд . Коллекции ; используя Windows . Пользовательский интерфейс . Xaml ; используя Windows . Пользовательский интерфейс . Xaml . Контроль ; используя Windows . Пользовательский интерфейс . Xaml . Управление . Примитивы ; используя Windows . Пользовательский интерфейс . Xaml . Данные ; используя Windows . Пользовательский интерфейс . Xaml . Вход ; используя Windows . Пользовательский интерфейс . Xaml . СМИ ; используя Windows . Пользовательский интерфейс . Xaml . Навигация ; // Шаблон элемента пустой страницы задокументирован на https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409 пространстве имен AppDemo { /// <summary> /// Пустая страница, которая может использоваться сама по себе или перемещаться в пределах рамки. /// </ резюме> общественного запечатаны частичного класса MainPage : Page { общественного String , C { получить ; набор ; } public MainPage () { this . InitializeComponent (); это . DataContext = this ; } private void BtnTest_OnClick ( отправитель объекта , RoutedEventArgs e ) { String msg = C ; } } } в основном классе не работает. Он привязывается к моему настраиваемому элементу управления. Может ли кто-нибудь увидеть проблему? Как я могу исправить код. Это не работает. Специально привязка не работает. Как я могу это решить. Я понятия не имею, как это исправить.

View public String T1 { set { t1 = value; OnPropertyChanged(nameof(T1)); Concat = T1 + T2; } }l Code

Mode

c#,wpf,uwp,user-controls,xaml-binding,

-1

Ответов: 2


0

It is generally better to put your properties that you want to bind to, within their own distinct view-model class - not mixed in with your view code. This code is unnecessarily obtuse.

BTW... Your UserControl named ExampleControl, has textboxes whose Text property is bound to T1 and T2. However, when you set either of those values - they set the Concat property but fail to raise the PropertyChanged event with their own name. You'd fix that with, for example:

Binding

0

Set the Mode of the Binding to TwoWay in your MainPage:

<local:ExampleControl Concat="{Binding C, Mode=TwoWay}"/>
c#,wpf,uwp,user-controls,xaml-binding,
Похожие вопросы