Dependency Property赢得';t在更改数据上下文后更新

本文关键字:数据 上下文 更新 赢得 Property Dependency | 更新日期: 2023-09-27 18:29:31

我有一个绑定到数据上下文的WPF文本框。

<TextBox Grid.Column="1" Grid.Row="4" Text="{Binding Path=Density,UpdateSourceTrigger=PropertyChanged}"/>

我在文本框的容器控件(本例中为tabItem)的代码中设置了数据上下文

tiMaterial.DataContext = _materials[0];

我还有一个列表框,里面有其他材料。当选择另一种材料时,我想更新文本字段,因此我编码:

private void lbMaterials_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
    _material = (Material) lbMaterials.SelectedValue;
    tiMaterial.DataContext = _material;            
}

Material类实现了INotifyPropertyChanged接口。我有双向更新,只是当我更改DataContext时,绑定似乎丢失了。

我错过了什么?

Dependency Property赢得';t在更改数据上下文后更新

我试着做你在帖子中描述的事情,但我真诚地没有发现问题。在我测试的所有情况下,我的项目都能完美地工作。我不喜欢你的解决方案,因为我认为MVVM更清晰,但你的方法也很有效。

我希望这对你有帮助。

public class Material
{
    public string Name { get; set; }    
}
public class ViewModel : INotifyPropertyChanged
{
    public ViewModel()
    {
        Materials = new Material[] { new Material { Name = "M1" }, new Material { Name = "M2" }, new Material { Name = "M3" } };
    }
    private Material[] _materials;
    public Material[] Materials
    {
        get { return _materials; }
        set { _materials = value;
            NotifyPropertyChanged("Materials");
        }
    }
    #region INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion
}
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModel();
    }
    private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        gridtext.DataContext = (lbox.SelectedItem);
    }
}

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid x:Name="gridtext">
        <TextBlock Text="{Binding Name}" />
    </Grid>
    <ListBox x:Name="lbox" 
             Grid.Row="1"
             ItemsSource="{Binding Materials}"
             SelectionChanged="ListBox_SelectionChanged">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>