WPF-自定义控件的依赖属性在双向模式下丢失绑定
我有这个自定义控件 XAML: 这就是我使用自定义控件的方式:WPF-自定义控件的依赖属性在双向模式下丢失绑定,wpf,data-binding,custom-controls,dependency-properties,Wpf,Data Binding,Custom Controls,Dependency Properties,我有这个自定义控件 XAML: 这就是我使用自定义控件的方式: <DockPanel> <ItemsControl ItemsSource="{Binding Path=DataList}" DockPanel.Dock="Left"> <ItemsControl.ItemTemplate> <DataTemplate> <B
<DockPanel>
<ItemsControl ItemsSource="{Binding Path=DataList}"
DockPanel.Dock="Left">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding}" CommandParameter="{Binding}" Click="Button_Click"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<local:UC Test="{Binding SelectedString, Mode=OneWay}"/>
</DockPanel>
--
public分部类主窗口:窗口,INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
受保护的void OnPropertyChanged(字符串名称)
{
PropertyChangedEventHandler处理程序=PropertyChanged;
if(处理程序!=null)
{
处理程序(此,新PropertyChangedEventArgs(名称));
}
}
私有可观察收集数据列表;
公共可观察收集数据列表
{
获取{return\u dataList;}
设置
{
_数据列表=值;
OnPropertyChanged(“数据列表”);
}
}
私有字符串\u selectedString;
公共字符串SelectedString
{
获取{return\u selectedString;}
设置
{
_selectedString=值;
OnPropertyChanged(“SelectedString”);
}
}
公共主窗口()
{
初始化组件();
this.DataList=新的ObservableCollection();
本文件为.DataList.Add(“1111”);
本数据表添加(“2222”);
本.数据表.添加(“3333”);
本数据表添加(“4444”);
this.DataContext=this;
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
this.SelectedString=(发送方为按钮).CommandParameter.ToString();
}
}
如果我不更改UC
的文本,一切正常。单击左面板中的每个按钮时,按钮的内容显示在UC
上
但是当我更改UC
(例如:改为9999)的文本时,Test
属性失去了绑定。单击左面板中的每个按钮时,UC
的文本与更改的文本相同(9999)。在调试中,我看到,SelectedString
会随着每次按钮的点击而改变,但UC的文本不会改变
我可以通过在UC
中使用此
来“修复”此问题
但是我只是想了解这个问题,有人能帮我解释一下吗。设置单向绑定的目标值会清除绑定。绑定
问题在下面一行
<local:UC Test="{Binding SelectedString, Mode=OneWay}"/>
=.=谢谢,但请再次阅读原始海报。我喜欢“设置单向绑定的目标值会清除绑定。”-非常感谢^^
<DockPanel>
<ItemsControl ItemsSource="{Binding Path=DataList}"
DockPanel.Dock="Left">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding}" CommandParameter="{Binding}" Click="Button_Click"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<local:UC Test="{Binding SelectedString, Mode=OneWay}"/>
</DockPanel>
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
private ObservableCollection<string> _dataList;
public ObservableCollection<string> DataList
{
get { return _dataList; }
set
{
_dataList = value;
OnPropertyChanged("DataList");
}
}
private string _selectedString;
public string SelectedString
{
get { return _selectedString; }
set
{
_selectedString = value;
OnPropertyChanged("SelectedString");
}
}
public MainWindow()
{
InitializeComponent();
this.DataList = new ObservableCollection<string>();
this.DataList.Add("1111");
this.DataList.Add("2222");
this.DataList.Add("3333");
this.DataList.Add("4444");
this.DataContext = this;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
this.SelectedString = (sender as Button).CommandParameter.ToString();
}
}
<local:UC Test="{Binding SelectedString, Mode=OneWay}"/>
<local:UC Test="{Binding SelectedString, Mode=TwoWay}"/>