WPF-自定义控件的依赖属性在双向模式下丢失绑定

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

我有这个自定义控件

XAML:

这就是我使用自定义控件的方式:

<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}"/>