像這樣創建一個視圖模型:
public class XmlDataViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler h = PropertyChanged;
if (h != null)
{
h(this, new PropertyChangedEventArgs(propertyName));
}
}
private XmlDocument _XmlData;
public XmlDocument XmlData
{
get { return _XmlData; }
set
{
if (value != _XmlData)
{
if (_XmlData != null)
{
// it's not likely you'll need this, but why take chances?
_XmlData.NodeChanged -= XmlData_NodeChanged;
}
_XmlData = value;
_XmlData.NodeChanged += XmlData_NodeChanged;
CanSave = false;
Provider = new XmlDataProvider { Document = XmlData };
OnPropertyChanged("Provider");
}
}
}
private void XmlData_NodeChanged(object sender, XmlNodeChangedEventArgs e)
{
CanSave = true;
}
public XmlDataProvider Provider { get; private set; }
public RelayCommand SaveCommand
{
get
{
return new RelayCommand(x => Save(), x => CanSave);
}
}
private bool CanSave { get; set; }
private void Save() { }
}
設置你的觀點的DataContext
這個對象的實例,並綁定控件像這樣:
<StackPanel DataContext="{Binding Provider}">
<TextBox Text="{Binding XPath=/Data/Field1}"/>
<TextBox Text="{Binding XPath=/Data/Field2}"/>
</StackPanel>
綁定您的按鈕(或任何)至SaveCommand
。
當你XmlData
屬性設置爲XmlDocument
(其綁定到XmlDataViewModel
之前或之後,你可以做到),它會創建一個新的XmlDataProvider
,提高PropertyChanged
,所以視圖的控件將全部刷新,數據將按照你的期望推出。對綁定控件的更改將增加NodeChanged
,該設置將設置CanSave
,這將啓用SaveCommand
。
如果隨後設置XmlData
到不同XmlDocument
,綁定控件將刷新和SaveCommand
將被禁用,直到用戶在新XmlDocument
變化的數據。並且之前的XmlDocument
的NodeChanged
事件將被取消註冊,以便可以丟棄該對象。
我得說,這對什麼是真正的非常少的代碼相當複雜的行爲。感謝您提出這個問題。
感謝@Robert - 我實現了這一點,它似乎運作良好,雖然東西在我的XAML觀點必須改變我的XML,因爲它吸引,因爲它激發了XMLNodeChanged事件,而它的繪製。 – Runonthespot 2011-05-11 11:15:15
我認爲這是我的問題@Erno的回答。我嘗試了他的方法,獲得了類似的結果。 – Runonthespot 2011-05-11 11:16:23
兩次修改上面的代碼,我不得不添加OnPropertyChanged(「CanSave」);到XmlData_NodeChanged事件處理程序,以便通知用戶界面CanSave已更改並知道要更新,當然,我必須跟蹤RelayCommand的實現(很簡單,但[在此](http://msdn.microsoft.com/zh-cn/ .com/en-us/magazine/dd419663.aspx)如果有人需要, – Runonthespot 2011-05-11 13:57:40