Tôi đã tạo một UserControl với một số DependencyProperties (trong ví dụ ở đây chỉ có một thuộc tính chuỗi). Khi tôi khởi tạo Usercontrol, tôi có thể thiết lập thuộc tính của UserControl và nó được hiển thị như mong đợi. Khi tôi cố gắng thay thế văn bản tĩnh bằng Binding, không có gì được hiển thị.Ràng buộc với UserControl DependencyProperty
My UserControl trông như sau:
<User Control x:Class="TestUserControBinding.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="30" d:DesignWidth="100">
<Grid>
<Label Content="{Binding MyText}"/>
</Grid>
</UserControl>
Bộ luật Đằng sau là:
namespace TestUserControBinding {
public partial class MyUserControl : UserControl {
public MyUserControl() {
InitializeComponent();
this.DataContext = this;
}
public static readonly DependencyProperty MyTextProperty =
DependencyProperty.Register(
"MyText",
typeof(string),
typeof(MyUserControl));
public string MyText {
get {
return (string)GetValue(MyTextProperty);
}
set {
SetValue(MyTextProperty, value);
}
}// MyText
}
}
Khi tôi cố gắng này trong MainWindow của tôi, mọi thứ đều như mong đợi:
<Window x:Class="TestUserControBinding.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestUserControBinding"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<local:MyUserControl MyText="Hello World!"/>
</StackPanel>
</Window>
Nhưng điều này không hoạt động:
<Window x:Class="TestUserControBinding.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestUserControBinding"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<local:MyUserControl MyText="{Binding Path=Text}"/>
<Label Content="{Binding Path=Text}"/>
</StackPanel>
</Window>
Hành vi của nhãn là chính xác, vì vậy không có vấn đề với "Văn bản" tài sản
sai lầm của tôi là gì? Tôi suy nghĩ nhiều giờ, nhưng không thể tìm thấy bất cứ điều gì tôi đã quên.
@Brian ... Mã "this.DataContext = this;" nên chú ý đến việc thiết lập DataContext thành cục bộ. Phải không? – Nishant
Ồ, vâng, tôi đã bỏ lỡ điều đó. Nhưng nếu bạn đang tạo một 'UserControl', tôi không nghĩ rằng bạn nên đặt' DataContext' theo cách thủ công. 'DataContext' được thiết kế để đại diện cho bối cảnh được kế thừa hoặc được gán từ vùng chứa. Liên kết 'RelativeSource' cho phép bạn đạt được kết quả mong muốn (liên kết với' DependencyProperty') trong khi không làm gián đoạn luồng thừa kế 'DataContext' chuẩn. Cố gắng ghi đè lên 'DataContext' như bạn sẽ thất bại nếu người dùng' UserControl' của bạn đặt 'DataContext' của riêng họ. –
đó chính xác là vấn đề.Thay vì thiết lập DataContext của MyUserControl thành chính tôi bây giờ tôi sử dụng 'x: Name =" MyName "' trong thẻ mở của 'MyUserControl' và các thay đổi Binding thành:' ' Tôi nghĩ rằng bạn giải pháp cũng nên làm việc, nhưng nó là một chút khó sử dụng. – Buchter