Привязка и обновление свойств зависимостей в пользовательском элементе управления - PullRequest
5 голосов
/ 18 января 2011

Я создал упрощенную версию своего кода, которая сталкивается с той же проблемой. Проблема заключается в том, что я не уверен, почему свойство зависимостей в моем пользовательском элементе управления не обновляется, когда оно изменяется в модели.

Модель:

public class MainWindowModel : INotifyPropertyChanged
{
    private bool isChecked;
    public bool IsChecked { get { return isChecked; } set { isChecked = value; OnPropertyChanged("IsChecked"); } }

    public event PropertyChangedEventHandler PropertyChanged;
    void OnPropertyChanged(string prop)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(prop));
    }
}

XAML:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:custom="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <custom:CustomTextbox x:Name="TextboxName" HorizontalAlignment="Center" VerticalAlignment="Center" Width="200" TextChanged="CustomTextbox_TextChanged">
        <custom:CustomTextbox.CustomTextboxItems>
            <custom:CustomTextboxItem IsChecked="{Binding IsChecked}" />
        </custom:CustomTextbox.CustomTextboxItems>
    </custom:CustomTextbox>

    <Button Content="Do It" Click="Button_Click" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,20" />
</Grid>
</Window>

Код сзади:

public partial class MainWindow : Window
{
    MainWindowModel model;

    public MainWindow()
    {
        InitializeComponent();

        model = new MainWindowModel();
        this.DataContext = model;
    }

    private void CustomTextbox_TextChanged(object sender, TextChangedEventArgs e)
    {
        model.IsChecked = true;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        if (TextboxName.CustomTextboxItems[0].IsChecked)
        {
            TextboxName.Text = "Property successfully changed";
        }
    }
}

Пользовательский контроль:

public class CustomTextbox : TextBox
{
    public CustomTextbox()
    {
        CustomTextboxItems = new ObservableCollection<CustomTextboxItem>();
    }

    public ObservableCollection<CustomTextboxItem> CustomTextboxItems { get; set; }
}

public class CustomTextboxItem : FrameworkElement
{
    public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register("IsChecked", typeof(bool), typeof(CustomTextboxItem), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

    public bool IsChecked
    {
        get { return (bool)GetValue(IsCheckedProperty); }

        set { SetValue(IsCheckedProperty, value); }
    }
}

Как вы можете видеть в пользовательском элементе управления, у меня есть коллекция элементов, которые содержат объекты со свойствами зависимостей, с которыми я хочу связать. Поэтому я создаю объекты в xaml и устанавливаю привязку, но когда я обновляю свойство binded в модели, оно не изменяется в пользовательском элементе управления. Есть идеи?

1 Ответ

5 голосов
/ 18 января 2011

Поиск ошибок привязки в окне вывода Visual Studio.Я думаю, вы найдете что-то, сообщающее вам, что привязка на флажке не удалась.

В вашем элементе управления CustomTextBox имеется коллекция CustomTextBoxItem объектов, для которых вы устанавливаете привязку.Однако вы ни в коем случае не добавляете эти элементы в логическое дерево.Прочтите мой пост здесь , чтобы узнать, как добавить эти элементы в логическое дерево.

...