I have created a simplified version of my code that experiences the same issue. The issue is that I'm not sure why the dependency property in my custom control is not updating when it gets changed in the model.
Model:
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>
Code Behind:
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";
}
}
}
Custom Control:
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); }
}
}
As you can see in the custom control, I have a collection of items that contain objects with dependency properties that I want to bind to. So I create the objects in the xaml and setup the binding, but when I update the binded property in the model, it doesn't change it in the custom control. Any ideas?
Look for binding errors in the Visual Studio output window. I think you'll find something telling you the binding on the check box has failed.
Your CustomTextBox
control has a collection of CustomTextBoxItem
objects, against which you're setting a binding. However, at no point are you adding those items to the logical tree. Read my post here to see how to add those items to the logical tree.
精彩评论