我花了三天時間試圖不問這個問題,因為已經有很多答案,但沒有一個能幫助我到現在。
我有一個MainWindowwith TabControl,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;
}
uj5u.com熱心網友回復:
要支持自動更新,屬性必須通知其更改,或者只能通過系結進行更改。
在這種情況下,您可以實作兩個選項:
- 將“MainWindow.SegmentId”屬性實作為 DependencyProperty。
- 洗掉“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>
uj5u.com熱心網友回復:
您必須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));
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/513555.html
