簡體   English   中英

屬性更新不會觸發綁定值更新

[英]Property update doesn't trigger bound value update

我花了三天時間試圖不問這個問題,因為已經有很多答案,但沒有一個能幫助我到現在。

我有一個帶有TabControlMainWindow ,其中有一個UserControl ,我需要將一個屬性從MainWindow傳遞給UserControl ,並且使用以下代碼它可以工作 - UserControl顯示“默認值”文本。 但是,只要MainWindow上該屬性的值發生變化,它就不會傳播到UserControl並且不會觸發其OnSelectedSegmentIdChange ,我盡我所能,請幫忙。

主窗口 XAML

<Window x:Class="Content_Manager.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        Title="MainWindow" Height="450" Width="800"
        xmlns:i="http://schemas.microsoft.com/xaml/behaviors" xmlns:usercontrols="clr-namespace:Content_Manager.UserControls"
        x:Name="mainWindow">
        
    <Grid>
      ...
    <ListView x:Name="lvSegments" 
              Grid.Column="0" 
              ItemsSource="{Binding Segments}"
              SelectionMode="Single"
              SelectionChanged="lvSegments_SelectionChanged">
      ...

    <TabControl Grid.Column="1">
        <TabItem Header="О Разделе">
            <usercontrols:SegmentInfoTab SelectedSegmentId="{Binding Path=SegmentId, ElementName=mainWindow}"/>            
    </TabItem>
        ...
    </TabControl>
</Grid>

主窗口 C#

public string SegmentId { get; set; } = "Default Value";

public MainWindow()
{
            InitializeComponent();
            DataContext = this;
            ...

    private void lvSegments_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        SegmentId = ((Segment)lvSegments.SelectedItem).Id;
    }
...

用戶控制 XAML

  ...
  x:Name="SegmentInfo">
    <Grid>
        <TextBox x:Name="txtName"                 
                 Text="{Binding SelectedSegmentId}"/>
  ...

用戶控制 C#

    public SegmentInfoTab()
    {
        InitializeComponent();
        DataContext = this;
    }

    public static readonly DependencyProperty SelectedSegmentProperty = DependencyProperty.Register("SelectedSegmentId",
        typeof(string),
        typeof(SegmentInfoTab),
        new PropertyMetadata(string.Empty, OnSelectedSegmentIdChanged));
    
    public string SelectedSegmentId {
        get => (string)GetValue(SelectedSegmentProperty);
        set => SetValue(SelectedSegmentProperty, value);
    }

    private static void OnSelectedSegmentIdChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var newValue= e.NewValue as string;
    }

要支持自動更新,屬性必須通知其更改,或者只能通過綁定進行更改。
在這種情況下,您可以實現兩個選項:

  1. 將“MainWindow.SegmentId”屬性實現為 DependencyProperty。
  2. 刪除“lvSegments_SelectionChanged”方法並改用綁定:
    <ListView x:Name="lvSegments" 
              Grid.Column="0" 
              ItemsSource="{Binding Segments}"
              SelectionMode="Single"
              SelectedValuePath="Id"
              SelectedValue="{Binding Path=SegmentId, ElementName=mainWindow}">

你怎么能那樣做? SelectedItem 不是用來設置值的嗎?

如果我理解正確你需要什么:

    <ListView x:Name="lvSegments" 
              Grid.Column="0" 
              ItemsSource="{Binding Segments}"
              SelectionMode="Single">
      ...

    <TabControl Grid.Column="1">
        <TabItem Header="О Разделе">
            <usercontrols:SegmentInfoTab
                SelectedSegmentId="{Binding
                                    Path=SelectedItem.SegmentId,
                                    ElementName=lvSegments}"/>            
        </TabItem>

您必須在您的屬性上實現INotifyPropertyChanged 請參閱: 如何:實現屬性更改通知

public class Segment : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string _segmentId = "Default Value";
    public string SegmentId
    {
        get { return _segmentId; }
        set
        {
            if (value != _segmentId) {
                _segmentId = value;
                OnPropertyChanged();
            }
        }
    }

    protected void OnPropertyChanged([CallerMemberName] string name = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM