我對 wpf 中的資料系結仍然比較陌生,但盡管瀏覽了此處和其他地方的所有文章和帖子,了解可能出現的問題,但我仍然沒有找到解決方案。下面的代碼是從我的大檔案中決議出來的流行資訊。
我已經確保其他一切都正常作業,包括添加一個屬性來檢索受保護的引數,options以確保options.FullPath實際上在瀏覽按鈕的Click事件上設定/更改。我想要訂閱的PropertyChanged事件與行的主要視窗test.PropertyChanged = ShowMessage;,ShowMessage是觸發一個方法MessageBox,在它的文本。我嘗試了該OnPropertyChanged方法的多種變體,從在呼叫方法中對其進行硬編碼到此處顯示的內容。我什至嘗試設定options為默認值,""以防萬一它很奇怪。任何事情都沒有運氣,而且我目前無法獲得 C#6,所以很可能我所擁有的內容適用于正確的語言更新,但我無法判斷,因為它不會觸發。
任何幫助或見解將不勝感激!
編輯:以下所有代碼都位于同一名稱空間內。
物件等級:
public class EEOptionSet: INotifyPropertyChanged
{
public EEOptionSet()
{
}
public event PropertyChangedEventHandler PropertyChanged;
private string _fullPath;
public string FullPath
{
get { return _fullPath; }
set
{
if (value != _fullPath)
{
_fullPath = value;
OnPropertyChanged();
}
}
}
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
主視窗后面的代碼:
public partial class window : Window
{
protected EEOptionSet options = new EEOptionSet();
private void BrowseFiles(object sender, RoutedEventArgs e)
{
options.FullPath = "Test";
}
}
我的主視窗的 xaml 中的文本框和按鈕實體(為簡潔起見,洗掉了網格放置、對齊等無關屬性):
<TextBox x:Name="FullPathText" Text="{Binding (options.FullPath), Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" Focusable="False"/>
<uc:ButtonExt x:Name="Browse" Content="..." Click="BrowseFiles"/>
注意:我也試過:
Text="{Binding options.FullPath, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
Text="{Binding Path=options.FullPath, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
Text="{Binding Path=(_currentOptionSet.FullPath), Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
以及沒有IsReadOnly和Focusable屬性。
uj5u.com熱心網友回復:
PropertyPath(這是 Binding.Path 屬性的型別)只能通過路徑運算式設定為源的公共屬性。你的變數
options是一個受保護的欄位。如果在 Binding 中未明確指定源(設定方式有三種:Source、ElementName 和 RelativeSource),則將設定系結的元素的 Data Context 用作源。您沒有以這四種方式中的任何一種指定來源。
設定資料背景關系及其使用的示例。
假設寫成:
- 在
EEOptionSet與OptionSet班-是同一個,你剛才復制的代碼時出錯; - 在
EEOptionSet類在同一個命名空間的宣告window。
<Window.DataContext>
<local:EEOptionSet/>
<Window.DataContext>
protected readonly EEOptionSet options;
public window()
{
InitializeComponent();
options = (EEOptionSet) DataContext;
}
<TextBox Text="{Binding FullPath, Mode=OneWay}"
IsReadOnly="True"
Focusable="False"/>
uj5u.com熱心網友回復:
您不能系結到受保護的欄位。
將DataContext視窗的設定為您的欄位:
public partial class window : Window
{
protected OptionSet options = new OptionSet();
public window()
{
InitializeComponent();
DataContext = options;
}
private void BrowseFiles(object sender, RoutedEventArgs e)
{
options.FullPath = "Test";
}
}
...并從 XAML 標記中的系結路徑中洗掉“選項”:
Text="{Binding FullPath, UpdateSourceTrigger=PropertyChanged}"
或者,創建視窗options的公共屬性并設定DataContext視窗本身:
public partial class window : Window
{
public OptionSet options { get; private set; }
public window()
{
InitializeComponent();
options = = new OptionSet();
DataContext = this;
}
private void BrowseFiles(object sender, RoutedEventArgs e)
{
options.FullPath = "Test";
}
}
然后你應該保持系結路徑原樣:
Text="{Binding options.FullPath, UpdateSourceTrigger=PropertyChanged}"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/315364.html
