/ डबलक्लिक पर / संपादन योग्य WPF ट्रीव्यू आइटम? (शैलियों के साथ?) - डब्ल्यूपीएफ, ट्रीव्यू

डबलक्लिक पर संपादन योग्य WPF ट्रीव्यू आइटम? (शैलियों के साथ?) - डब्ल्यूपीएफ, ट्रीव्यू

मैं एक WPF noob का एक सा हूँ, इसलिए इस सवाल () में किसी भी निहित चतुराई के लिए माफी!

मैं WPF ट्रीव्यू के संपादन को सक्षम करने की कोशिश कर रहा हूँडबलक्लिक के साथ लेबल - I "इस के चारों ओर घूमता है, और ऐसा लगता है कि ऐसा करने के दो तरीके कस्टम नियंत्रण के साथ या एक शैली के साथ हैं जो एक TextBox / TextBlock में से एक को छुपाता है।

लेबल को सेट करने के लिए एक शैली का उपयोग करना एक DataTrigger पर आधारित टेक्स्टबॉक्स होना आसान लगता है (उदाहरण के लिए नीचे 1), लेकिन इसका मतलब है कि किसी भी समय एक पंक्ति का चयन किया जाता है, इसे "संपादित किया जा रहा है"।

मैं वास्तव में ऐसा करने के लिए क्या करना चाहता हूं(पाठ बॉक्स में संक्रमण) एक मूसड डबलक्लिक इवेंट पर, लेकिन ऐसा लगता है कि EventTriggers नीचे दिए गए तरीके से "t" का उपयोग नहीं किया जा सकता है, क्योंकि वे "क्षणिक हैं। (यह प्रतीत नहीं होता है कि मैं कोडबाइंड में डबलक्लिक इवेंट का उपयोग कर सकता हूं, क्योंकि वह "टी (??) मुझे टेक्स्टबॉक्स दिखाने / छिपाने के लिए प्रदर्शित नियंत्रणों को प्रभावित करने की अनुमति नहीं देता है)।

पूर्ण विकसित कस्टम नियंत्रण का उपयोग करना विकल्प की तरह लगता है - यहाँ एक एएएएलएमओएसटी काम करने का उदाहरण है ( http://www.codeproject.com/KB/WPF/editabletextblock.aspx ), हालांकि यह HierachicalDataTemplate क्लॉज की उपस्थिति में "t काम नहीं करता है (और यह एक समाधान आगामी है) की तरह नहीं दिखता है"।

(उदाहरण 1 - चयनित होने पर टेक्स्टब्लॉक से टेक्स्टबॉक्स पर स्विच करें)

<Window x:Class="treetest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:treetest"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<Style x:Key="EditableContentControl" TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate DataType="{x:Type local:CompositeViewModel}">
<TextBlock Text="{Binding Path=Name}" />
</DataTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsSelected,RelativeSource=RelativeSource AncestorType={x:Type TreeViewItem}}}"
Value="True">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate DataType="{x:Type local:CompositeViewModel}">
<TextBox Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<TreeView Margin="12,12,115,12" Name="treeView1"
ItemsSource="{Binding Path=GetRootData}"
>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:CompositeViewModel}" ItemsSource="{Binding Path=Children}">
<ContentControl Content="{Binding}" Style="{StaticResource EditableContentControl}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Grid>
</Window>

उत्तर:

उत्तर № 1 के लिए 4

क्या इसने सहायता की:

        string name = "some name";
var treeItem = new TreeViewItem()
{
Header = name,
};
var textBox = new TextBox()
{
Text = name,
};
treeItem.MouseDoubleClick += (o, e) =>
{
TreeItem.Header = textBox;
};
textBox.LostFocus += (o, e) =>
{
treeItem.Header = textBox.Text;
name = textBox.Text;
};

यह काफी सरल है और यह मेरे लिए ठीक काम करता है।


जवाब के लिए 0 № 2

क्या हुआ अगर इसके बजाय आप पर नज़र रखी जाएIsEditing जैसे आपके बाध्य डेटा की कस्टम संपत्ति पर ट्रिगर? तब आप IsEditing को सही पर सेट कर सकते हैं जब भी आप ऐसा होने के लिए बदलना चाहते हैं (जैसे कि आपके मामले में, जब माउस बटन पर क्लिक किया जाता है)।


जवाब के लिए 0 № 3

अच्छी तरह से देखिए CallActionMethod ब्लेंड से। यह विशेष ट्रिगर आपको किसी भी ईवेंट जैसे डबल क्लिक और आपके कोड में एक विधि के बीच एक ढीला लिंक बनाने देता है।

यदि आप कमांड का उपयोग करना पसंद करते हैं तो आप उसी के साथ कर सकते हैं InvokeCommandAction। आप किसी भी ईवेंट को कमांड कर सकते हैं।