Я работаю над настраиваемым элементом управления. Я хочу, чтобы он поддерживал привязку данных, поэтому его легко поддерживать, как встроенные элементы управления.Привязка к пользовательскому свойству настраиваемого свойства управления не работает
Вот что я получил до сих пор:
окно Window.xaml код, который содержит мой контроль:
<custom:Matrix x:Name="customMatrix" DockPanel.Dock="Top" Title="{Binding Title}"/>
... и его Window.xaml.cs код- за (всего фрагмента ViewModel)
public ViewModel VM { get; private set; } private ProblemManager() { VM = new ViewModel(); InitializeComponent(); DataContext = VM; VM.Title = "a title"; } public class ViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public ViewModel() { ItemsList = new ObservableCollection<List<int>>(); } public ObservableCollection<List<int>> ItemsList { get; set; } protected string title; public string Title { get { return title; } set { if (title != value) { title = value; NotifyPropertyChanged("Title"); } } } protected void NotifyPropertyChanged(string name) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(name)); } } }
моего контроля Matrix.xaml
// ... <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Title}"/> // ...
и элемент управления Matrix.xaml.cs фонового код
public partial class Matrix : UserControl { public Matrix() { InitializeComponent(); DataContext = this; } public static readonly DependencyProperty TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(Matrix), new PropertyMetadata("", TitleChanged)); public string Title { get { return (string)GetValue(TitleProperty); } set { SetValue(TitleProperty, value); } } private void TitleChanged(string title) { Title = title; } private static void TitleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ((Matrix)d).TitleChanged((string)e.NewValue); } }
И дело в том, что если не является обязательным в моем окне XAML к Matrix.Title
собственности т.е. придав этому значение статический в xaml, как Title="some title"
, привязка внутри моего кода управления работает (я могу даже сделать customMatrix.Title += "1";
в моем окне, и он работает). Однако при привязке к свойству Matrix.Title
(как и в приведенном коде) он не работает, и я получил пустой заголовок на мой взгляд. Чтобы четко сформулировать это, работает привязка к элементам управления по умолчанию в окне.
Как сделатьMatrix.Title
Недвижимость можно использовать?
не указав DataContext моего контроля сделано в 'конструктору Matrix' по' DataContext = это; '? – patryk
Doh! Я даже не видел этого :) Но да, это ваша проблема прямо там, вы не можете просто изменить DataContext, чтобы указать на то, что вы хотите, потому что оно становится измененным из-под вас при размещении в главном окне.Избавьтесь от функции TitleChanged, удалите эту строку, которая назначает контекст данных в вашем пользовательском элементе управления и использует использование привязки FindAncestor, и это устранит вашу проблему. –
Вы говорите, что назначение «DataContext = this;» не имеет никакого эффекта, когда я использую элемент управления где-то еще? Во всяком случае, я пытаюсь сделать то, что вы мне сказали. Помещение этого объявления привязки в Matrix.xaml дает мне ошибку, что 'custom' не определен. В действительности это не так, потому что я использую 'custom' как мое пространство имен xaml в Window.xaml. Я также старался иметь «x: Type Matrix» без везения. Что мне сейчас не хватает? – patryk