[英]Property update doesn't trigger bound value update
我花了三天時間試圖不問這個問題,因為已經有很多答案,但沒有一個能幫助我到現在。
我有一個帶有TabControl
的MainWindow
,其中有一個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;
}
要支持自動更新,屬性必須通知其更改,或者只能通過綁定進行更改。
在這種情況下,您可以實現兩個選項:
<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.