मेरा समाधान ग्रीम ब्रैडबरी के समान है, लेकिन मैं डेटास्टेट स्विचवियर का उपयोग नहीं करता, क्योंकि यदि मेरा एक्स नियंत्रण एक टैब पैनल (या कुछ समान) के अंदर रखा गया है और जब मैं किसी अन्य टैब पर हूं, तो राज्य बदलता है, तो मैं ' एक अपवाद प्राप्त होगा ('तत्व' नहीं मिला ..)। अपवाद फेंक दिया गया है क्योंकि मेरा एक्स नियंत्रण अनलोड किया गया है जबकि मैं एक और टैब पर हूं और जिन तत्वों को अद्यतन करने की आवश्यकता है, वे नहीं मिलते हैं।
तो यहाँ मैं क्या कर रहा है:
मेरे विचार मॉडल में मैं एक संपत्ति VisualState एक सूचना संदेश भेजता है जब एक राज्य में परिवर्तन (मैं MVVM light toolkit का उपयोग करें):
private string visualState = XVisualStates.InitialState;
public string VisualState
{
get
{
return visualState;
}
set
{
visualState = value;
Messenger.Default.Send(new XStateChangedMessage(value));
}
}
और मेरा विचार के कोड में पीछे मैं एक अधिसूचना की सदस्यता:
public partial class XControl : UserControl
{
private string visualState = XVisualStates.InitialState;
public XControl()
{
InitializeComponent();
//go to state when view is loaded
Loaded += (s, e) => ChangeState(); //every time a view is loaded go to current state
//change visual state when a notification is received
Messenger.Default.Register<XStateChangedMessage>(this,
state =>
{
visualState = state.CurrentState; //save current state
ChangeState();
});
}
void ChangeState()
{
try
{
VisualStateManager.GoToState(this, visualState, true); //will throw an exception if current view is unloaded
}
catch
{
//NOTE: supress 'element' not found errors if user navigated to another view and state changes
}
}
}
और XStateChangedMessage एक साधारण वर्ग है:
public class XStateChangedMessage
{
public string CurrentState { get; private set; }
public XStateChangedMessage (string currentState)
{
CurrentState = currentState;
}
}
तो क्या मैं अपने नियंत्रण पर दृश्य राज्यों को परिभाषित कर सकता हूं (एक बालविंडो पर भी?) और फिर उन्हें डेटास्टेटस्विचबैवियर का उपयोग करके स्विच कर सकते हैं? उदाहरण के लिए, एक राज्य 'SearchInProgress' हो सकता है। बटन को अक्षम करने के लिए मैं वीएसएम का उपयोग कैसे कर सकता हूं ताकि नियंत्रण 'SearchInProgress' में नियंत्रण के दौरान क्लिक करने योग्य न हो? –
धन्यवाद ग्रीम। मुझे यह एक नमूना परियोजना में काम करने के लिए मिला और ऐसा लगता है कि यह जाने का रास्ता है। हालांकि, मुझे यहां उल्लिखित एक ही समस्या में भागना प्रतीत होता है: http://stackoverflow.com/questions/2118814/how-can-i-use-visualstates-in-a-childwindow। वीएसएम बाल खिड़कियों में काम नहीं कर रहा है। अब मैं सबकुछ उपयोगकर्ता नियंत्रण में रखूंगा और संदर्भ दूंगा कि बच्चे की खिड़की में। मैं DataStateSwitcher का उपयोग कर रहा हूं जिसका आपने इसे ViewModel-driven बनाने के लिए उल्लेख किया है। –